2016-11-09 27 views
-2

我最近讀到的協方差和逆變 - 下面一點的代碼示例:逆變實踐 - C#

public class BaseClass{ 
    public int x = 1; 

    public static void print(BaseClass objClass) 
    { 
     Console.WriteLine(objClass.GetType().Name + " " + objClass.x); 
    } 
} 

public class DerivedClass : BaseClass{ 
    public int x = 2; 
} 

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     BaseClass bC = new BaseClass(); 
     DerivedClass dC = new DerivedClass(); 

     BaseClass.print(bC); //DerivedClass 1 
     DerivedClass.print(bC); //DerivedClass 1 
     BaseClass.print(dC); //DerivedClass 1 
     DerivedClass.print(dC); //DerivedClass 1 
    } 
} 

我的問題是 - 什麼逆變讓我們在實踐中?我知道我可以將DerivedClass的對象作爲參數傳遞給BaseClass方法(其中參數是BaseClass類型),但此類操作的好處是什麼?爲什麼當我傳遞DerivedClass對象時,它會在BaseClass中返回我的x值?

也許這是一個不好的例子來解釋逆變的好處,那麼我會感激另一個例子。

+6

這不會在任何地方使用反轉。 – Lee

+0

哇 - 所以在互聯網上有誤導性的教程;)但無論如何 - 有人可以解釋我爲什麼當我通過DerivedClass對象它返回BaseClass中x的值?如果沒有改變,爲什麼我們能做到這一點? PS: Sinatr - 感謝那個鏈接 – Hadrian

+1

你正在混淆與遺傳/多態性的差異。 –

回答

1

爲什麼當我傳遞DerivedClass對象時,它會在BaseClass中返回我的x值?

你是隱藏派生類中的字段。實際上DerivedClass兩個x字段 - 一個來自基類,一個來自派生類。由於參數print的類型爲BaseClass,因此編譯器會將objClass.x綁定到基類中的字段。

相反,如果你有一個虛擬的特性和控制裝置:

public class BaseClass{ 
    public virtual int x {get {return 1;}} 

    public static void print(BaseClass objClass) 
    { 
     Console.WriteLine(objClass.GetType().Name + " " + objClass.x); 
    } 
} 

public class DerivedClass : BaseClass{ 
    public override int x {get {return 2;}} 
} 

或者只是設置基域在派生類中不同的值:

public class DerivedClass : BaseClass{ 
    public DerivedClass() {x = 2;} 
} 

你會看到你期望的結果。

+0

非常感謝您的幫助!現在對我來說很清楚! – Hadrian