这是我最近试图解决的问题的简化版本。 我有以下两个类:
class Container { }
class Container<T> : Container
{
T Value
{
get;
private set;
}
public Container(T value)
{
Value = value;
}
public T GetValue()
{
return Value;
}
}
现在我想做:
Container<int> c1 = new Container<int>(10);
Container<double> c2 = new Container<double>(5.5);
List<Container> list = new List<Container>();
list.Add(c1);
list.Add(c2);
foreach (Container item in list)
{
Console.WriteLine(item.Value);
Console.WriteLine(item.GetValue());
}
实现此功能的最佳方法是什么?有可能吗?我想我可能已经解决了这个问题,但我认为这是一个解决方法,我正在寻找一些设计模式。
提前感谢您的回复, 米甲
P.S。
我试过接口,虚函数,抽象类,抽象函数;甚至在超类中创建函数,可以通过名称调用实际类型的属性(使用反射)......我仍然无法实现我想要的......
答案 0 :(得分:6)
您可以将基类Container放入接口:
interface IContainer
{
object GetValue();
}
然后在派生类中明确实现:
class Container<T> : IContainer
{
public T Value { get; private set; }
public Container(T value)
{
Value = value;
}
public T GetValue()
{
return Value;
}
object IContainer.GetValue()
{
return this.GetValue();
}
}
更改列表以包含IContainer元素:
Container<int> c1 = new Container<int>(10);
Container<double> c2 = new Container<double>(5.5);
List<IContainer> list = new List<IContainer>();
list.Add(c1);
list.Add(c2);
foreach (IContainer item in list)
{
Console.WriteLine(item.GetValue());
}
Container上的公共Value属性有点令人困惑,但你明白我的观点。
答案 1 :(得分:5)
这是你想要的东西吗?这允许您遍历值。
abstract class Container
{
public abstract object RawValue { get; }
}
class Container<T> : Container
{
public override object RawValue
{
get { return this.Value; }
}
T Value
{
get;
private set;
}
public Container(T value)
{
Value = value;
}
}
编辑:无论你想要什么,你都可以调用Container.RawValue,这是我想到的第一件事。以下是您的称呼方式:
Container<int> c1 = new Container<int>(10);
Container<double> c2 = new Container<double>(5.5);
List<Container> list = new List<Container>();
list.Add(c1);
list.Add(c2);
foreach (Container item in list)
{
Console.WriteLine(item.RawValue);
Console.WriteLine(item.RawValue);
}
答案 2 :(得分:3)
只是为了添加你已经拥有的答案,这不是多态的问题,而是类型特化的问题。就编译器而言,Container
和Container<T>
不是一回事,因此List<Container>()
与List<Container<T>>()
不同。
您可以执行类似
的操作List<Container<int>> list = new List<Container<int>>();
但这也不适用于List<Container<double>>
。所以答案是将GetValue()
定义移动到接口。