Как создать Список открытого универсального типа класса <T>? - PullRequest
0 голосов
/ 26 октября 2019

я работаю над другим кодом, мне нужно добавить несколько вещей, у меня есть класс

public abstract class Data<T>
{

}

public class StringData : Data<string>
{
}

public class DecimalData : Data<decimal>
{
}

в моей программе, я хочу сохранить список данных другого типа

List<Data> dataCollection=new List<Data>();

dataCollection.Add(new DecimalData());
dataCollection.Add(new stringData());


List<Data> dataCollection=new List<Data>();

в строке выше я получаю сообщение об ошибке компилятора. Использование универсального типа «Данные» требует аргументов 1 типа

Может ли кто-нибудь подсказать, что я делаю неправильно;

Ответы [ 2 ]

1 голос
/ 26 октября 2019

В 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();

Но вы потеряли некоторую универсальность дизайна и строгую типизацию ...

И вы можете предоставить любое неуниверсальное поведение, такое как свойства и методы, с которыми вам нужно работатьна.

0 голосов
/ 26 октября 2019

Для этого вам не нужно использовать дженерики.

public abstract class Data {

}

public class StringData : Data {
}

public class DecimalData : Data {
}

List<Data> dataCollection = new List<Data>();

dataCollection.Add(new DecimalData());
dataCollection.Add(new StringData());
...