【发布时间】:2017-08-20 02:24:42
【问题描述】:
如果我有以下情况:
public abstract class Parameter<T>
{
protected T value;
public virtual T Value
{
get { return value; }
set { this.value = value; }
}
protected Parameter(T startingValue)
{
value = startingValue;
}
}
public class FloatParameter : Parameter<float>
{
public FloatParameter(float startingValue) : base(startingValue){}
}
public class IntParameter : Parameter<int>
{
public override int Value
{
get { return value; }
set { this.value = value > 100 ? 100 : value; }
}
public IntParameter(int startingValue) : base (startingValue) {}
}
有没有办法创建一些可以包含任何派生类型的List<Parameter>?例如,类似:
// no type specified in Parameter
List<Parameter> storedParameters = new List<Parameter>();
storedParameters.Add(new FloatParameter(2f));
storedParameters.Add(new IntParameter(7));
foreach(Parameter p in storedParameters)
{
DoSomethingWithValue(p.Value);
}
或者,或者,如果这个实现有缺陷,有没有更好的方法来做到这一点?我在这里的感觉有点幼稚。
【问题讨论】:
-
为什么要将芒果放在橙子列表中?
-
那么,
Value在您的示例中应该有什么类型? -
这个实现的问题是你尝试使用的两种类型。 Int 和 float 是结构,这意味着一旦将 T 分配给其中一个,就不能再添加另一个。
-
你能添加
DoSomethingWithValue的代码吗? -
DoSomethingWithValue是一种对值进行运行时类型检查的通用方法。并且Value应该与泛型指定的类型相同。所以FloatParameter的Value属性应该返回一个浮点数。
标签: c# .net oop generics polymorphism