Присвоение класса, который наследуется от ограниченного базового класса, наследуемому базовому классу с ограниченным родовым классом - PullRequest
0 голосов
/ 28 июня 2018

У меня есть базовый класс:

public abstract class Foo<T> where T : TBase { ... }

У меня также есть следующие классы, которые реализуют TBase:

public abstract class ImplementsTBase1 : TBase { ... }
public abstract class ImplementsTBase2 : TBase { ... }

Я создаю новые классы, которые реализуют это:

public class Bar1 : Foo<ImplementsTBase1> { ... }
public class Bar2 : Foo<ImplementsTBase2> { ... }

Теперь я хочу добавить два экземпляра этих классов в контейнер следующим образом:

public static List<Foo<TBase>> FooList = new List<Foo<TBase>>();
...
FooList.Add(new Bar1());
FooList.Add(new Bar2());

Однако я не могу этого сделать. Что я могу сделать, чтобы реализовать это?

1 Ответ

0 голосов
/ 28 июня 2018

Если вы определяете интерфейс, который определяет T как ковариант

Интерфейс, имеющий параметр контравариантного типа, позволяет его методам принимать аргументы менее производных типов, чем те, которые указаны параметром типа интерфейса.

public interface IFoo<out T> where T : TBase{}

затем выведите из него:

public abstract class Foo<T> : IFoo<T> where T : TBase{}

теперь вы можете

List<IFoo<TBase>> FooList = new List<IFoo<TBase>>();

и

FooList.Add(new Bar1());
FooList.Add(new Bar2());

прекрасно работает.

Конечно, это накладывает ограничения на методы, которые IFoo<out T> может реализовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...