簡體   English   中英

如何創建 class 的開放泛型類型列表<t> ?</t>

[英]How to create List of open generic type of class<T>?

我正在研究其他人的代碼我需要添加一些東西我有一個 class

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 種類型 arguments

誰能指導我做錯了什么?

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

您還可以使用非通用抽象 class 代替接口:

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

但是你失去了一些通用性設計和強類型......

您可以提供任何非泛型行為,例如您需要操作的屬性和方法。


Generics 開閉構造型

C# 方差問題:將 List<Derived> 分配為 List<Base>

如何對 C# 中的開放類型進行泛型多態性?

C#:方差(協方差/逆變)是多態性的另一個詞嗎?

C# 通用 inheritance 和協方差第 2 部分

仍然對協變和逆變和輸入/輸出感到困惑


協變和逆變 (C#)

協方差和逆變

泛型類(C# 編程指南)

您不需要為此使用 generics 。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM