如何在 C# 中实现某种程度的多态性?
这是我最近一直试图解决的问题的简化版本。 我有以下两个类:
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());
}
实现此功能的最佳方法是什么?有可能吗?我想我可能有解决这个问题的方法,但我认为这是一个解决方法,我正在寻找一些设计模式。
预先感谢您的回复, 米哈尔.
PS
我尝试过接口、虚函数、抽象类、抽象函数;甚至在超类中创建函数,通过名称调用真实类型的属性(使用反射)...我仍然无法实现我想要的...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以将基类 Container 转换为接口:
然后在派生类中显式实现该接口:
更改列表以包含 IContainer 元素:
Container 上的公共 Value 属性有点令人困惑,但您明白我的意思。
You could the base class Container into an interface:
Which is then explicitly implemented in the derived classes:
Change the list to contain IContainer elements:
The public Value property on Container is kind of confusing, but you get my point.
您正在寻找这样的东西吗?这允许您迭代这些值。
编辑:您可以随意调用 Container.RawValue,这是我首先想到的。您可以这样称呼它:
Is something like this what you're looking for? This allows you to iterate through the values.
EDIT: You can call Container.RawValue whatever you want, that was the first thing that came to mind. Here is how you would call it:
只是添加到您已有的答案中,这不是多态性问题,而是类型专业化的问题。就编译器而言,
Container
和Container
不是同一件事,因此List()
也不是与List>()
相同。您可以执行类似的操作
,但这也不适用于
List>
。因此,答案是将 GetValue() 定义移至接口。Just to add to the answers you already have, this isn't a matter of polymorphism, it's a problem of type specialization. As far as the compiler is concerned,
Container
andContainer<T>
are not the same thing, soList<Container>()
is not the same thing asList<Container<T>>()
.You can do something like
But that won't work with
List<Container<double>>
either. So the answer is to move theGetValue()
definition to an interface.