假设我有一个通用的抽象类:
ClassA<T> where T: ClassB
现在
public class ClassC: ClassB
和
public class NewClass: ClassA<ClassC>
我可以使用默认构造函数创建NewClass
对象,但是我找不到将它保存在更通用的ClassA<T>
对象的泛型集合中的方法。
列表定义为
List<ClassA<ClassB>>
无法保留NewClass
个对象。我想在同一个系列中保留不同类型的东西。有没有办法在C#中做到这一点?
另外,我希望尽可能避免使用接口和虚拟呼叫。
答案 0 :(得分:2)
你的问题比你的问题简单得多,它与parameter variance有关。 看到这些非常简单的类:
public class Base {}
public class Derived : Base {}
List<Derived>
不是List<Base>
,而这正是您所面临的问题。这是为什么?因为您可以将new Base()
添加到后者,但不能添加到前者。同样在您的情况下,NewClass
是ClassA<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>