Список абстрактного класса - PullRequest
12 голосов
/ 19 сентября 2011

У меня есть абстрактный класс:

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<MyClass> myList;

Теперь я хочу создать

myList = new List<MyClass1>;

Компилятор показывает ошибку:

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

Я должен быть простым способом конвертировать ... Я не могу найти ничего полезного

Ответы [ 3 ]

11 голосов
/ 19 сентября 2011

Преобразование List<Derived> в List<Base>.

небезопасно.

Что вы ожидаете, если напишите

List<MyClass1> derivedList = ...
List<MyClass> baseList = derivedList;
baseList.Add(new MyClass2());    //Boom!

Вы просите ковариацию ; ковариация возможна только с интерфейсами только для чтения.
Таким образом, IEnumerable<Derived> конвертируется в IEnumerable<Base>.

9 голосов
/ 19 сентября 2011

Вы можете создать список как базовый тип:

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

К которому вы можете затем добавить производные элементы:

myList.Add(new MyClass2());
1 голос
/ 19 сентября 2011

У вас должен быть список базовых классов, и позже вы можете использовать Linq для получения списка элементов MyClas1, когда вам это нужно.

 List<MyClass> BaseList = new ...

 BaseList.FillWithItems();

 List<MyClass1> DerivedList = BaseList.OfType<MyClass1>().ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...