抽象类列表

本文关键字:列表 抽象类 | 更新日期: 2023-09-27 18:09:06

我有一个抽象类:

public abstract class MyClass
{
    public abstract string nazwa
    {
        get;
    }
}

和两个继承自MyClass的类:

public class MyClass1 : MyClass
{
    public override string nazwa
    {
        get { return "aaa"; }
    }
}
public class MyClass2 : MyClass
{
    public override string nazwa
    {
        get { return "bbb"; }
    }
}

在另一个类中创建List:

List<MyClass> myList;
现在我要创建
myList = new List<MyClass1>;

编译器显示错误:

Cannot implicitly convert type 'System.Collections.Generic.List<Program.MyClass1>' to 'System.Collections.Generic.List<Program.MyClass>'

我必须有一些简单的方法来转换它…我找不到有用的东西

抽象类列表

您可以创建列表作为基类型:

List<MyClass> myList = new List<MyClass>();

,然后可以添加派生项到:

myList.Add(new MyClass2());

List<Derived>转换为List<Base>是不安全的。

如果你写

你期望会发生什么?
List<MyClass1> derivedList = ...
List<MyClass> baseList = derivedList;
baseList.Add(new MyClass2());    //Boom!

你要求协方差;协方差只能在只读接口中实现。
因此,IEnumerable<Derived>可转化为IEnumerable<Base>

你必须有一个基类列表,以后你可以使用Linq来获得MyClas1项目列表,当你需要它的时候。

 List<MyClass> BaseList = new ...
 BaseList.FillWithItems();
 List<MyClass1> DerivedList = BaseList.OfType<MyClass1>().ToList();