【问题标题】:Polymorphism in Generic types泛型类型中的多态性
【发布时间】:2023-03-05 21:46:01
【问题描述】:

我有一个表示动态值、最大值和最小值以及其他一些字段的通用结构,该结构增加动态值直到达到最大值并减小直到达到最小值 - 然后来回循环。 当我希望这个结构表示几种数值类型时,问题就来了: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>,我再次希望列表具有多种类型的结构,而不仅仅是整个列表的一种类型

【问题讨论】:

标签: c# list generics polymorphism constraints


【解决方案1】:

根据您的示例,您似乎想使用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# - Multiple generic types in one list

【讨论】:

  • 也试过了,但是当我声明像“List list”这样的列表时,它说我需要在 myStruct 中放置一个类型
  • 你能提供一些代码吗,你可能遗漏了一些通过示例很容易找出的细节。
【解决方案2】:

您的问题将是 eField&lt;int&gt;eField&lt;float&gt; 没有共同的祖先类型(除了对象)。您要么需要:

private List<object> _fields;

这个列表可能包含eField&lt;int&gt;eField&lt;float&gt;,但它也可能包含其他内容。或者您可以使用基类或接口:

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

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

【讨论】:

  • 您的解决方案很好,但是将来只为此类操作提供接口可能被视为不好的做法。现在应该只创建空接口来描述实现它的类的一些特殊处理。
  • 我理解(可能是错误的)除了像_value、_minValue 等私有字段之外,还有像Increment() 这样的公共方法。这样的方法可以在接口上,您可以在迭代列表时针对接口进行编码。
【解决方案3】:

您可以使用一些修改器和访问器来包装对列表的访问。

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

  return this;
}

那么列表可以是List&lt;Object&gt;。如果您正确地附上该列表,那么您也可以确保类型安全。

【讨论】:

    猜你喜欢
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多