4

私はC#のことは初めてです....(.net 3.5)

Dictionary に 2 つの異なるタイプのオブジェクトを保持させたいのですが、そのうちの 1 つはジェネリックです。リストを繰り返し処理しながら、add や clone などのメソッドを呼び出します。基本クラスとサブクラスで試してみました....

namespace ConsoleApplication1 {
    class Element{
    }
    class Child1 : Element {
        public Child1 Clone() { return clone; }
    }
    class Child2<T> : Element {
        public Child2<T> Clone() { return clone; }
    }
    class Program {
        static void Main(string[] args) {
            Dictionary<string, Element> d = new Dictionary<string, Element>();
            d.Add("c1",  new Child1());
            d.Add("c2s", new Child2<string>());
            d.Add("c2i", new Child2<int>());
            foreach (KeyValuePair<string, Element> kvp in d) {
                Element e = kvp.Value.Clone();
            }
        }
    }
}

私のニーズに対する方法または解決策はありますか?

ありがとう!アンナ

4

4 に答える 4

3

基本型 ( ) でorを作成できClone、派生型でそれを作成できますが、オーバーライド時に戻り値の型を変更することはできないため、そうする必要があります(より具体的なものはありません)。メソッド ( ...) を再宣言することはできますが、それは面倒です。また、同じ型で同じ名前/シグネチャのメソッドを作成することはできません。abstractvirtualElementoverrideElementnewoverridenew

しかし、戻り値の型に満足している場合はElement...

abstract class Element{
    public abstract Element Clone();
}
class Child1 : Element {
    public override Element Clone() { return /* your code */; }
}
class Child2<T> : Element {
    public override Element Clone() { return /* your code */; }
}
于 2010-02-20T10:18:58.663 に答える
2

ディクショナリから取得する .Value のタイプは Element であるため、Clone メソッドのように、Element が必要なすべての操作を定義していることを確認する必要があります。

私は...するだろう:

  1. Clone を仮想化し、それを Element に追加します (または、Element を抽象化し、Clone を仮想ではなく抽象化します)。
  2. Child1 と Child2 の両方で Clone をオーバーライドする

このように、コードkvp.Value.Clone()は辞書から返されたオブジェクトに応じて適切な Clone メソッドを呼び出します。

于 2010-02-20T10:14:09.707 に答える
0

ただし、1 つのディクショナリにさまざまなオブジェクトを追加できるようにするためだけに、クラス階層を作成しないでください。

クラスに十分な階層関係がない場合はICloneable、.NET フレームワークで既に利用可能な のようなインターフェイスを使用することをお勧めします。

次に、次のように Dictionary をインスタンス化するだけです。

Dictionary<string, ICloneable> d = new Dictionary<string, ICloneable>();

より柔軟です。Clone() を実行できるという共通性のために階層を作成することは、IMO の正しい解決策ではありません。

于 2010-02-20T11:03:25.463 に答える
0

私はWimに同意しますが、ICloneable存在しないクラス階層を強制しようとするよりも、実装する方がおそらくより良い解決策であることに注意してくださいICloneable。 (たとえばhttp://pro-thoughts.blogspot.com/2009/02/write-deep-clone-forget-about.htmlを参照するか、「ICloneable C# bad API」を Google 検索してください

于 2010-02-20T11:50:14.263 に答える