如何创建class <T>的开放通用类型列表?

时间:2019-10-26 12:55:48

标签: c# list generics collections polymorphism

我正在处理其他人的代码,我需要添加一些内容 我上课

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 个答案:

答案 0 :(得分:1)

C#中还没有菱形运算符,因此您不能在封闭构造类型基础上的开放泛型类型上使用真正的多态性。

Generics -Open and closed constructed Types

Generic Classes (C# Programming Guide)

所以您不能创建这样的列表:

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

但是您失去了一些通用性设计和强大的功能...

您还可以提供任何非通用行为,例如需要操作的属性和方法。

答案 1 :(得分:0)

您不需要为此使用泛型。

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