包含泛型继承类的列表

时间:2014-10-21 14:39:54

标签: c# list generics inheritance

假设我有一个通用的抽象类:

ClassA<T> where T: ClassB

现在

public class ClassC: ClassB

public class NewClass: ClassA<ClassC>

我可以使用默认构造函数创建NewClass对象,但是我找不到将它保存在更通用的ClassA<T>对象的泛型集合中的方法。 列表定义为

List<ClassA<ClassB>>

无法保留NewClass个对象。我想在同一个系列中保留不同类型的东西。有没有办法在C#中做到这一点? 另外,我希望尽可能避免使用接口和虚拟呼叫。

1 个答案:

答案 0 :(得分:2)

你的问题比你的问题简单得多,它与parameter variance有关。 看到这些非常简单的类:

public class Base {}

public class Derived : Base {}

List<Derived> List<Base>,而这正是您所面临的问题。这是为什么?因为您可以将new Base()添加到后者,但不能添加到前者。同样在您的情况下,NewClassClassA<ClassC>ClassC继承自ClassB,但NewClass ClassA<ClassB>

您很可能需要重新设计您的架构,可能还有接口(可以根据您的需要进行协变或逆变)。

编辑:一些实施想法

例如,您可以定义协变接口接口:

public interface IClassA<out T> where T : ClassB

然后List<IClass<ClassB>>将能够拥有NewClass

或者您可以ClassA<T>继承非genric基类ClassA

public class ClassA
public class ClassA<T> : ClassA  where T : ClassB

然后,您可以将NewClass存储在List<ClassA>