2016-11-09 23 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