C#多态简单题

标签 c# polymorphism

我有一个类 X 和一个类 Y,后者派生自 X:

class x {}
class y : x {}

然后我在某处使用 X 的列表:

List<X> lstX;
...

然后我想使用一个新的 Y 列表,来 self 的另一个列表中的数据......类似这些:

List<Y> lstY = lstX;

我相信 X 列表中的项目会自动转换为 Y,但事实并非如此。

此外,我如何从某个 X 初始化 Y 的新实例?我想这样做:

var newX = new X();
var newY = new Y(X);

但它似乎并不像那样工作。

感谢您的帮助! 抱歉格式化,尽我所能

最佳答案

这里有几个问题。

第一:“我可以将Tiger类型的对象赋值给Animal类型的变量。为什么我不能将Tiger类型的List对象赋值给Animal类型的变量?”

因为这会发生:

List<Tiger> tigers = new List<Tiger>();
List<Animal> animals = tigers; // this is illegal because if we allow it...
animals.Add(new Giraffe()); // ... then you just put a giraffe into a list of tigers.

在 C# 4 中,这样做是合法的:

IEnumerable<Tiger> tigers = new List<Tiger>();
IEnumerable<Animal> animals = tigers;

这是合法的,因为IEnumerable<T>没有“添加”方法,因此可以保证这是安全的。

有关 C# 4 的这一新功能的详细信息,请参阅我关于协方差的系列文章。

http://blogs.msdn.com/ericlippert/archive/tags/Covariance+and+Contravariance/default.aspx

第二个问题:“我如何从某个 Animal 初始化 Tiger 的新实例?”

你不能。有问题的动物可能是瓢虫。你打算如何从 Ladybug 实例初始化一个新的 Tiger?那没有任何意义,所以我们不允许您这样做。如果您想编写自己的知道如何将任意动物变成老虎的特殊方法,您可以自由地这样做。但我们不知道如何为您做到这一点。

关于C#多态简单题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2231668/

相关文章:

c# - ResourceDictionary 样式触发器不起作用

c# - 如何将 CustomControl 属性绑定(bind)到控件本身?

c++ - 在父类的 vector 上调用子类的方法

c++ - 使同质容器中的派生类彼此不同地交互

c++ - 是否可以从派生类向基类 A 添加类成员?

oop - Clojure 的核心是面向对象的吗? (序列中的多态性)

c# - 如何在C#中设置下载超时

c# - Unity 中 RegisterInstance 的后期绑定(bind)版本

c# - LINQ 到 SQL : If database return no values Count() throws an exception

java - 如何在Java中创建某种对象类型的List?