使用接口的泛型列表
本文关键字:泛型 列表 接口 | 更新日期: 2023-09-27 17:50:20
以下两个问题:
是否可以在c#中使用无类型泛型列表?
和
我如何能够创建一个列表<包含一个开放的通用接口?>
public interface IValue
{
object Min { get; set; }
object Max { get; set; }
object Avg { get; set; }
}
public abstract class Value<T> : IValue
{
abstract T Min;
abstract T Max;
abstract T Avg;
object IValue.Avg { get { return Avg; } }
object IValue.Min { get { return Min; } }
object IValue.Max { get { return Max; } }
public Value(T min, T max, T avg)
{
Min = min;
Max= max;
Avg = avg;
}
}
在代码的其他地方....
Value myValue = new Value<ulong>(x, y, z);
Value myValue = new Value<ushort>(x, y, z);
List<IValue> myList = new List<IValue>();
myList.add(myValue);
//Do stuff like myList[0].Min
我不能让这个正常工作。我想这与我的界面以及我使用它的方式有关。我希望能够调用构造函数并设置值,但我需要。
我得到错误,如"修饰符'抽象'无效的字段。尝试一个属性代替"answers"不能创建接口值的抽象类的实例",但我也不能做新的IValue。
-
你不能创建一个接口的对象,所以你不能做
new IValue()
。 -
你不能创建一个抽象类型的对象,所以你也不能做
new Value<SomeType>()
-
Value<T>
、Min
、Max
、Avg
为字段,不能抽象。你想用属性代替:public abstract T Min { get; set; } public abstract T Max { get; set; } public abstract T Avg { get; set; }
-
你可能根本不想使用
abstract
。Value<T>
看起来非常完整,并且考虑到您希望能够创建它,没有理由将其作为抽象类型。
为什么要用abstract呢?如果你想创建类实例,类不能是抽象。
public class Value<T>: IValue {
// Better to name these fields as "min, max, ave" or "m_Min, m_Max, m_Ave"
T Min;
T Max;
T Avg;
// Do not forget about "set" accessors
object IValue.Avg {
get { return Avg; }
set { Avg = (T) value; }
}
object IValue.Min {
get { return Min; }
set { Min = (T) value; }
}
object IValue.Max {
get { return Max; }
set { Max = (T) value; }
}
public Value(T min, T max, T avg) {
Min = min;
Max = max;
Avg = avg;
}
}
...
// "Value<ulong> myValue" instead of "Value myValue "
Value<ulong> myValue = new Value<ulong>(x, y, z);
List<IValue> myList = new List<IValue>();
myList.Add(myValue);