1

まず、次のようなものがあります。

class Parent
{

    int x;

    public Parent(int _x)
    {
        x = _x
    }
}

class Child1: Parent
{
    int y;

    public Child1(int _y):base(_y)
    {
        y=_y;
    }
}

class Child2: Parent
{
    int z;

    public Child2(int _z):base(_z)
    {
        z=_z;
    }
}

単純な親子階層。次に、実際にはChild1とChild2でいっぱいのリストがあります。リスト内の各オブジェクトのコピーを作成し、そのコピーとなる新しいアイテムを作成することから始めたいと思います。

しかし、私がこれを行う場合:

foreach(Parent p in list)
dictionaryOfCopies.Add(p, new Parent(p.x));

その場合、辞書は、Children1とChildren2ではなく、Parentのものでいっぱいになります。オブジェクトの特定のタイプを知らなくても、親タイプとして型指定されたオブジェクトのコンストラクターを呼び出す方法はありますか?

4

2 に答える 2

5

ICloneableこれを行う 1 つの方法は、オブジェクトにインターフェイスを実装し、各インスタンス自体を複製させることです。

class Parent : ICloneable
{
    int x;    
    public Parent(int _x)
    {
        x = _x
    }

    public virtual object Clone()
    {
        return new Parent(x);
    }
}

class Child1 : Parent
{
    int y;

    public Child1(int _y) : base(_y)
    {
        y = _y;
    }

    public override object Clone()
    {
        return new Child1(y);
    }
}

class Child2 : Parent
{
    int z;

    public Child2(int _z) : base(_z)
    {
        z = _z;
    }

    public override object Clone()
    {
        return new Child2(z);
    }
}

次に、次のように使用します。

foreach(Parent p in list)
{
    dictionaryOfCopies.Add(p, p.Clone() as Parent);
}

悪魔の擁護者になるために、私が見たICloneableインターフェイスに対する批判の 1 つは、それがタイプ セーフではないということです。それが煩わしい場合は、同じ考えを採用することもできますが、代わりにCloneを返すメソッドの独自のバージョンを実装します。Parentobject

于 2012-08-13T18:36:38.713 に答える
0

各子クラスでオーバーライドされるクローン メソッドを親に追加できます。それはあなたが呼び出すことを可能にするでしょう

dictionaryOfCopies.Add(p, p.Clone());
于 2012-08-13T18:37:40.520 に答える