Страницы

Поиск по вопросам

воскресенье, 29 декабря 2019 г.

Наследование от абстрактного класса

#c_sharp #шаблоны_проектирования #абстрактная_фабрика


Есть следующий не большой проект:

AbstractClass.cs

public abstract class AbstractClass
{

}


Gover.cs

class Gover : AbstractClass
{

}


Program.cs

class Program
{
    public List list;
    void Main(string[] args)
    {
        list = new List(); //Ошибка: Неявное преобразование типа "...List"
в "...List
    }


Но появляется (как показано выше) ошибка не понятная мне. Почему я не могу присвоит
объекту AbstractClass объект Gover? Ведь Gover унаследован от AbstractClass?
    


Ответы

Ответ 1



Как уже сказал @VladD, проблема в том, что List не ковариантен по T (т.к. List - класс, а классы в C# могут быть только инвариантны). Однако вместо него можно использовать реализуемый им ковариантный интерфейс IEnumerable, чтобы сделать ваш код рабочим. Например: public class Test { public static IEnumerable list; static void Main(string[] args) { list = new List(); } }

Ответ 2



Проблема вот в чём: List не ковариантен по T. Нормальными словами: Если T1 — подкласс T2, то при этом List не подкласс List. Почему это так? Смотрите. Допустим, что такое, как вы написали, было бы возможно: public List list; List goverList = new List(); list = goverList; Тогда было бы возможно написать: list.Add(new Gover2()); где Gover2 — другой потомок AbstractClass. То есть в списке goverList, который вроде бы имеет тип List, внезапно оказался бы элемент постороннего типа Gover2. Катастрофа! Вывод: так, как вы написали, не получится. Пишите list = new List(), например. Или сделайте тип списка шаблонным. Или ещё что-нибудь, в зависимости от того, что вам нужно.

Комментариев нет:

Отправить комментарий