创建Type <superclass>的通用列表并使用派生类填充它的解决方法?</superclass>

时间:2009-03-10 03:00:58

标签: c# generics inheritance

我想创建一个List并将派生类添加到此列表中。

我在这里看到,这在.NET中的设计是不可能的:http://msdn.microsoft.com/en-us/library/aa479859.aspx#fundamentals_topic12

那么最佳实践解决方案是什么?我想我可以将我的派生类打包,使它们看起来像我的超类,但感觉有点笨拙。我想我应该以不同的方式设计我的课程......但是如何?

3 个答案:

答案 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>,那就可以了。