繁体   English   中英

泛型中的多态性

[英]Polymorphism in Generic types

我有一个表示动态值,max和min值以及其他一些字段的Generic结构,struct增加动态值直到达到最大值并减小直到达到最小值 - 然后来回循环。 当我希望这个结构代表几个数值类型时,问题出现了:double,uint,int32,float ...并且还在一个列表中存储了几个结构。 所以我得到的是这个结构实例的列表,它迫使我选择整个列表的结构类型 - 但我想在一个列表中使用各种类型。 我怎么能实现这样的事情呢? 我尝试使用约束并使“where T:object”,但它说我不能使用Object类作为约束...

public struct eField<T> where T : struct
{
    private string _fieldName;
    private T _value;
    private T _minVal;
    private T _maxVal;
    private double _duration;
}

public class Device
{
    private List<eField> _fields;
}

当然它会构成一个错误,说明eField必须得到一个类型参数T>,我希望列表有几种类型的结构,而不仅仅是整个列表的一种类型

根据您的示例,看起来您想要使用where T: struct因此您将限制为值类型。

编辑

public interface IeField { }

public class eField<T> : IeField where T : struct
{
    private string _fieldName;
    private T _value;
    private T _minVal;
    private T _maxVal;
    private double _duration;
}

并使用它。

List<IeField> fields;
fields.Add(new eField<int>());
fields.Add(new eField<uint>());
fields.Add(new eField<double>());

看看这篇文章C# - 一个列表中的多个泛型类型

你的问题是eField<int>eField<float>没有共同的祖先类型(除了object)。 你要么需要:

private List<object> _fields;

此列表可以包含eField<int>eField<float> ,但它也可以包含其他内容。 或者您可以使用基类或接口:

public interface IField { ... }
public struct eField<T> : IField {...}

在这种情况下,您可以拥有List<IField> 如果IField上的方法不是通用的(void DoStuff()),那么你可以对它进行编码。 如果IField有通用方法(它是IField<T> ),那么你我会回到同一条船上。 但大概如果你正在编写列表中所有项目的代码,它们之间会有一些共同之处。

您可以使用一些mutator和accessor来包含对列表的访问。

public Device addField<T>(eField<T> field) where T : struct {
   this.fieldList.add(field);

  return this;
}

然后列表可以是List<Object> 如果您正确地附上该列表,那么您也确保了类型安全。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM