抽象类列表

时间:2011-09-19 17:43:39

标签: c# list abstract

我有抽象类:

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>'

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

3 个答案:

答案 0 :(得分:11)

List<Derived>转换为List<Base>

是不安全的

如果你写

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

你要求协方差;只有只读接口才能实现协方差 因此,IEnumerable<Derived>可转换为IEnumerable<Base>

答案 1 :(得分:9)

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

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

然后您可以将派生项添加到:

myList.Add(new MyClass2());

答案 2 :(得分:1)

您必须拥有基类列表,稍后您可以在需要时使用Linq获取MyClas1项目列表。

 List<MyClass> BaseList = new ...

 BaseList.FillWithItems();

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