1

これは、私が最近解決しようとしていた問題の単純化されたバージョンです。次の2つのクラスがあります。

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

この機能を実装する最良の方法は何ですか? それはまったく可能ですか?この問題の解決策があると思いますが、回避策と考えており、設計パターンを探しています。

Michal さん、ご回答ありがとうございます。

PS

インターフェイス、仮想関数、抽象クラス、抽象関数を試しました。名前で実際の型のプロパティを呼び出すスーパークラスで関数を作成しても(リフレクションを使用)...私はまだ私が望むものを達成することができません...

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 の public 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 に答える