包含泛型继承类的列表
本文关键字:列表 继承 泛型 包含 | 更新日期: 2023-09-27 18:27:28
假设我有一个通用抽象类:
ClassA<T> where T: ClassB
现在
public class ClassC: ClassB
和
public class NewClass: ClassA<ClassC>
我可以用默认构造函数创建NewClass
对象,但我找不到将其保存在更通用的ClassA<T>
对象的通用集合中的方法。像一样定义的列表
List<ClassA<ClassB>>
无法容纳NewClass
对象。我想在同一个系列中保留不同风格的人。在C#中有什么方法可以做到这一点吗?此外,如果可能的话,我希望避免使用接口和虚拟调用。
您的问题比您的问题简单得多,它与参数方差有关。查看这些非常简单的类:
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>
从非泛型基类ClassA
继承。
public class ClassA
public class ClassA<T> : ClassA where T : ClassB
然后您可以将NewClass
存储在List<ClassA>
中