2013-09-24 111 views
1

下面是代碼,我想明白一些事情:基類對象是否包含drived類對象?

public class Test { 
    public void dosomething() { 
     Derived2 d2 = new Derived2() ; 
     Base bobject = d2; 
     string str = "str" ; 
     bobject.Method1(str); // I want to call Method1 of Derived1 class 
    } 
    } 

    public class Derived2 : Derived1 { 
    public void Method1(string s) { 

    } 
    } 

    public class Derived1 : Base { 
    public override void Method1(double d) { 

    } 

    public override void Method2(double d) { 

    } 
    } 

    public abstract class Base { 
    public abstract void Method1(double d); 
    public abstract void Method2(double d); 
    } 

我想知道,什麼時候我們給派生類對象,以抽象基類對象到底會發生。我知道實例化抽象類是不可能的。在我的情況下,我派生類Derived1和分配對象Derived2類到基抽象類對象。現在我想訪問Dervied2類方法方法1它接受字符串參數。不知何故,我無法訪問此方法。存在多個從基本抽象類派生的類。我想保留通用的東西。

+0

看到重寫和隱藏之間的區別在這裏描述:http://stackoverflow.com/questions/856449/overloading-overriding-and-hiding。您重寫了double方法,但字符串方法隱藏了Method1 – Ibasa

回答

1

當我們分配派生類對象,以抽象基類對象

有沒有對象分配在你的代碼,有變量賦值到底發生了什麼。 賦值後,變量bobject引用的是相同的對象,因爲d2。對象類型(以及對象狀態中的任何內容)保持不變。

現在我要訪問的Dervied2類方法方法一其接受字符串參數

,您無法在樣本中做到這一點沒有鑄造bobjectDerived2

((Derived2)bobject).Method1(str)

我想保留通用的東西

然後,您不應該嘗試訪問不屬於基類的成員。

+0

,正如您所提到的:「在賦值之後,變量bobject指向與d2相同的對象,對象類型(以及對象狀態中的任何對象)保持不變。那麼爲什麼我不能訪問Derived2的Method1? – User1551892

+0

因爲*變量*的類型(不是* object *的類型,該變量引用!)是'Base'。由於'Base'不包含所需的方法,因此無法訪問它。 – Dennis

0

bobjectBase的一種,它有兩種方法接受雙精度值,而不是字符串(該方法在Derived2的實現中定義)。

要你requrie什麼你需要投bobject到Derived2的,如:

var d3 = bobject as Derived2; 
d3.Method1("String"); 
+0

'bobject = new Derived1(); var d3 = bobject作爲Derived2; d3.Method1(「String」);' - 開心調試。 – Dennis

0

你甚至可以做

(bobject爲Derived2的).Method1(串);

這是因爲分辨率是基於變量類型的。

相關問題