2012-03-02 33 views
1

那麼,因爲我從手機輸入這個我不能鍵入或複製粘貼整個代碼,因此我連接到SO後 - - >What is the error in this code? Interview在c#oop如何解釋爲什麼基類可以採取派生類實例

如果你這樣做 X a = new Y();它編譯爲 。一位採訪者問這怎麼可能?我知道如果X被定義爲抽象類,這將是可能的,但事實並非如此。

+0

爲什麼不能編譯?你的問題是「什麼是繼承」? – 2012-03-02 01:47:23

+0

@chris基類和派生類可以擁有自己獨特且不同的方法/屬性/字段定義。所以從邏輯上說,這個陳述不應該被編譯......但是它確實......我不知道它背後的原因 – deostroll 2012-03-02 01:53:43

+0

如果你不瞭解繼承,你需要閱讀一本編程手冊,一篇文章或者一篇博文繼承。真正爲C++,Java,C#等編寫的任何東西都適用於這個例子。 – 2012-03-02 02:00:03

回答

1

要擴大BrankoDimitrijević的回答,這可能是因爲Liskov substitution principle

您的評論,你說

基類和派生類可以有自己的獨特和不同的方法/屬性/字段定義。所以在邏輯上,該聲明不應該編譯...但它確實...我不知道它背後的原理

確實,基類和派生類有它們自己的成員定義,但它們並非完全是截然不同。具體地說,基類的每個成員也是派生類的成員。例如,你可以總是說

object o = anything; 
Console.WriteLine(o.ToString()); 
Console.WriteLine(o.GetHashCode()); 
Console.WriteLine(o.GetType().Name); 

你可以這樣做,因爲每個對象都有的ToString,GetHashCode的,和的GetType方法,因爲每一個對象的運行時類型的對象繼承直接或間接的影響。

你可以做同樣的不是對象以外的基類:

class X 
{ 
    public string Exclamation { get { return "Inherit this!"; } } 
} 
class Y : X 
{ 
    public string Question { get { return "What's up with that?"; } } 
} 

然後,它是完全合法的說

X x = new Y(); 
Console.WriteLine(x.Exclamation); 

不過,當然,你不能說

X x = new Y(); 
Console.WriteLine(x.Question); //does not compile! 

爲了使用Question屬性,您需要有一個Y類型的引用。

回顧一下:因爲基類的每個成員也都是派生類的成員,所以可以使用派生類的實例,就好像它是基類的實例一樣。派生類實例具有基類的所有成員。

您提出了抽象類的主題。當然,抽象類不能被實例化;你只能實例化一個從抽象類派生的類。然而,這並不影響替代原則,除了暗示變量的類型是抽象類必須指的是派生類型的實例,而類型爲非抽象(非密封)類的變量可能是指派生類型的一個實例。

4

如果Y繼承X,那麼Y是一種 X,並且可以在X可以使用的任何地方使用。

無論X是否抽象,這都會起作用。

1

類Y要麼繼承類X,要麼X是Y繼承的接口。

但是如果有人在求職面試中問我,我會告訴他們,我不想在開發人員創建具有單個字符名稱的類型的任何地方工作。

-1

C#支持所謂的協變和逆變。協變是隱式地(沒有任何額外的代碼)在本例中將一個派生類(在這種情況下是Y)轉換爲基類(在這種情況下爲X)的能力。這是可能的,因爲Y擴展了X,這意味着Y具有與X 。這允許將X類型的變量分配給派生類。

這對於擴展類和重載非常重要。如果X類包含一個叫Foo的方法和派生類X創建了一個叫Foo的方法,即使它被轉換爲一個類型X.這裏從Y中的方法將被稱爲是一個例子:

public class X 
{ 
    public void Foo() 
    { 
     Console.WriteLine("Something"); 
    } 
} 
public class Y : X // y derives from X 
{ 
    public override void Foo() 
    { 
     Console.WriteLine("Class Y"); 
    } 
} 
public class Program 
{ 
    static void Main() 
    { 
      X item = new Y(); // covariance. 
      item.Foo(); // prints "Class Y" 
    } 
} 

希望這不是誇大,我不知道你的技能水平。來自MSDN的這篇文章解釋了它是一個litten,http://msdn.microsoft.com/en-us/library/ee207183.aspx

+2

這與協方差無關,它只是基本的遺傳/多態性 – BrokenGlass 2012-03-02 02:13:22

0

讓我們假設

class Animal 
{ 

} 

class Tiger:Animal 
{ 

} 

Animal fooAnimal = new Tiger() 

這是可能的,因爲Tiger是一種類型的Animal

相關問題