В C # еще нет оператора ромба, поэтому вы не можете использовать истинный полиморфизм для открытых универсальных типов, лежащих в основе закрытых построенных типов.
Универсальные -открытые и закрытые построенные типы
Общие классы (Руководство по программированию в C #)
Поэтому вы не можете создать такой список:
List<Data<>> list = new List<Data<>>();
Нельзя использовать полиморфизмв таком списке ... и здесь не хватает универсальности.
Например, в C # вы не можете создать List<Washer<>>
экземпляр, чтобы иметь некоторые Washer<Cat>
и некоторые Washer<Dog>
для работы Wash()
на них ...
Все, что вы можете сделать, это использовать список объектов или некрасивый неуниверсальный шаблон интерфейса:
public interface IData
{
void SomeMethod();
}
public abstract class Data<T> : IData
{
public void SomeMethod()
{
}
}
List<IData> list = new List<IData>();
foreach (var item in list)
item.SomeMethod();
Вместо этого вы также можете использовать неуниверсальный абстрактный классинтерфейса:
public abstract class DataBase
{
public abstract void SomeMethod();
}
public abstract class Data<T> : DataBase
{
public override void SomeMethod()
{
}
}
List<DataBase> list = new List<DataBase>();
foreach (var item in list)
item.SomeMethod();
Но вы потеряли некоторую универсальность дизайна и строгую типизацию ...
И вы можете предоставить любое неуниверсальное поведение, такое как свойства и методы, с которыми вам нужно работатьна.