我想创建一个List并将派生类添加到此列表中。
我在这里看到,这在.NET中的设计是不可能的:http://msdn.microsoft.com/en-us/library/aa479859.aspx#fundamentals_topic12
那么最佳实践解决方案是什么?我想我可以将我的派生类打包,使它们看起来像我的超类,但感觉有点笨拙。我想我应该以不同的方式设计我的课程......但是如何?
答案 0 :(得分:3)
如果我明白你要做什么,你应该能够做得很好。
List<SuperClass> myList = new List<SuperClass>();
SubClass item1 = new SubClass();
SuperClass item2 = new SuperClass();
myList.add(item1);
myList.add(item2);
这是有效的代码,然后您可以轻松地从列表中检索元素,并使用多态的基本规则来相应地更改对象的类型。
答案 1 :(得分:2)
作为Brian notes,这应该可以正常工作。人们在这个领域看到的唯一常见限制是列表的协方差作为方法参数 - 即他们发现他们无法将List<Dog>
传递给接受List<Animal>
的方法。在这种情况下,答案是泛型:
public void Foo<T>(IList<T> list) where T : Animal {...}
....
List<Dog> dogs = ...
Foo(dogs); // implicit <Dog>
有关协方差的更多讨论(包括不更改上述方案的C#4.0更改,see here)。
答案 2 :(得分:1)
这样可以正常工作。虽然您不知道列表中项目的确切类型(没有强制转换),但是将派生类型添加到基类型集合中没有问题。
本文链接的是您尝试将派生类型集合用作基类型集合的情况:
void DisplayFruit(List<Fruit> fruit)
{
fruit.ForEach(f => Console.WriteLine(f.ToString()));
}
List<Apples> apples = new List<Apples>();
// add apples here
DisplayFruit(apples); //Error!
如果苹果被宣布为List<Fruit>
,那就可以了。