包含泛型继承类的列表

本文关键字:列表 继承 泛型 包含 | 更新日期: 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()添加到后者,但不能添加到前者。类似地,在您的案例中,NewClassClassA<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>