1

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

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

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

提前感谢您的回复,米哈尔。

附言

我尝试了接口、虚函数、抽象类、抽象函数;甚至在超类中创建函数,通过名称调用真实类型的属性(使用反射)......我仍然无法实现我想要的......

4

3 回答 3

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

于 2011-03-01T22:03:20.720 回答
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); 
} 
于 2011-03-01T22:03:21.003 回答
3

只是为了添加您已经拥有的答案,这不是多态性的问题,而是类型专业化的问题。就编译器而言,ContainerContainer<T>不是一回事,所以List<Container>()List<Container<T>>().

你可以做类似的事情

List<Container<int>> list = new List<Container<int>>();

但这也不起作用List<Container<double>>。所以答案是将GetValue()定义移动到接口。

于 2011-03-01T22:09:22.330 回答