实践中的逆变-C#
我最近读到了关于协方差和逆方差的内容——下面是一个小代码示例:实践中的逆变-C#,c#,inheritance,contravariance,C#,Inheritance,Contravariance,我最近读到了关于协方差和逆方差的内容——下面是一个小代码示例: public class BaseClass{ public int x = 1; public static void print(BaseClass objClass) { Console.WriteLine(objClass.GetType().Name + " " + objClass.x); } } public class DerivedClass : BaseCla
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的对象作为参数传递给基类方法(其中参数是基类类型),但这种操作的好处是什么?为什么当我传递DerivedClass对象时,它会返回基类中x的值
也许这是一个不好的例子来解释逆变的好处,那么我将感谢另一个例子
为什么当我传递DerivedClass对象时,它会返回基类中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;}
}
你会看到你期望的结果。这在任何地方都没有使用逆变。哇-所以互联网上有误导性的教程;)但无论如何,有人能解释为什么当我传递DerivedClass对象时,它会返回基类中x的值吗?如果没有什么改变,为什么我们可以这么做?PS.Sinatr-谢谢你的链接,你把方差和继承/多态混淆了。好的,我理解,很抱歉混淆了-但是有人能回答我上面的问题吗?我将非常感激!谢谢你的解释!现在我很清楚了!