c# - 如何在 C# 中实现某种程度的多态性?

标签 c# generics polymorphism specialization superclass

这是我最近一直试图解决的问题的简化版本。 我有以下两个类:

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()); 
} 

实现此功能的最佳方式是什么?有可能吗?我想我可能有解决这个问题的方法,但我认为这是一种变通方法,我正在寻找一些设计模式。

预先感谢您的回复, 米甲。

附言

我试过接口(interface)、虚函数、抽象类、抽象函数;甚至在父类(super class)中创建函数来按名称调用真实类型的属性(使用反射)...我仍然无法实现我想要的...

最佳答案

您可以将基类 Container 放入接口(interface)中:

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 的公共(public) Value 属性有点令人困惑,但你明白我的意思。

关于c# - 如何在 C# 中实现某种程度的多态性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5160871/

相关文章:

c# - 动态 Getvalue 返回对象转换为 PropertyInfo.PropertyType

function - 泛型函数,类和 “where”关键字

scala - 在没有继承层次结构的scala中编写通用代码

c++ - 基于派生类型的编译时行为分支

c# - 如何在 Visual Studio 中更改大括号/圆括号的颜色

c# - WCF Unhandled FaultException 未由用户代码处理

c# - 将参数传递给 json webservice

java - 接口(interface)内的泛型方法

c# - Swashbuckle 多态性支持问题

ruby-on-rails - 如何从字符串中获取模型类?