如何创建类<T>的开放泛型类型列表? [英] How to create List of open generic type of class<T>?

查看:21
本文介绍了如何创建类<T>的开放泛型类型列表?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在处理其他人的代码,我需要添加一些东西我有课

公共抽象类数据{}公共类 StringData : Data{}公共类 DecimalData : Data{}

在我的程序中,我想维护不同类型数据的列表

ListdataCollection=new List();dataCollection.Add(new DecimalData());dataCollection.Add(new stringData());列表<数据>dataCollection=new List();

在上面一行我收到编译器错误使用泛型类型 'Data' 需要 1 个类型参数

任何人都可以指导我做错了什么;

解决方案

C# 中还没有菱形运算符,所以你不能在封闭构造类型的底层开放泛型类型上使用真正的多态.

所以你不能像这样创建一个列表:

List>list = new List();

你不能在这样的列表上使用多态......而且这里缺乏通用性.

例如,在 C# 中,你不能创建一个 List> 实例来拥有一些 Washer 和一些 Washer<;Dog> 对它们进行 Wash() 操作...

你所能做的就是使用对象列表或丑陋的非通用接口模式:

公共接口IData{void SomeMethod();}公共抽象类 Data: 数据{public void SomeMethod(){}}列表list = new List();foreach(列表中的变量项目)item.SomeMethod();

您也可以使用非通用抽象类代替接口:

公共抽象类DataBase{公共抽象无效 SomeMethod();}公共抽象类 Data: 数据库{公共覆盖 void SomeMethod(){}}列表<数据库>list = new List();foreach(列表中的变量项目)item.SomeMethod();

但是你失去了一些通用性设计和强类型......

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


泛型开放和封闭构造类型

C# 方差问题:分配列表作为列表<基础>

如何对开放类型进行泛型多态C#?

C#:是方差(Covariance/Contravariance)多态的另一种说法?

C# 泛型继承和协方差第 2 部分

仍然对协方差和逆变感到困惑 &进/出


协方差和逆变 (C#)

协方差&逆变

泛型类(C# 编程指南)

i am working on someone else code i need to add few things i have a class

public abstract class Data<T>
{

}

public class StringData : Data<string>
{
}

public class DecimalData : Data<decimal>
{
}

in my program i want to maintain list of different type of data

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

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


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

at above line i am getting compiler error Using the generic type 'Data' requires 1 type arguments

Can any one guide what i am doing wrong;

解决方案

There is no diamond operator in C# yet, so you can't use true polymorphism on open generic type underlying to closed constructed types.

So you can't create a list like this:

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

You can't use polymorphism on such list... and it is a lack in genericity here.

For example, in C# you can't create a List<Washer<>> instance to have some Washer<Cat> and some Washer<Dog> to operate Wash() on them...

All you can do is using a list of objects or an ugly non generic interface pattern:

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

You can also use a non generic abstract class instead of an interface:

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

But you lost some genericity design and strong-typing...

And you may provide any non-generic behavior such as properties and methods you need to operate on.


Generics open and closed constructed types

C# variance problem: Assigning List<Derived> as List<Base>

How to do generic polymorphism on open types in C#?

C# : Is Variance (Covariance / Contravariance) another word for Polymorphism?

C# generic inheritance and covariance part 2

still confused about covariance and contravariance & in/out


Covariance and Contravariance (C#)

Covariance & Contravariance

Generic Classes (C# Programming Guide)

这篇关于如何创建类&lt;T&gt;的开放泛型类型列表?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆