0

Clone()これが私のクラスの実装です:

    MyClass^ Clone(){
        return gcnew MyClass(this->member1, this->member2);
    }

今、私はから派生した約10のクラスを持っていますMyClass。実装はいずれの場合も同じです。いずれの場合も実際のクラス名を使用して呼び出す必要があるため、gcnewのほぼ同一の実装を10個作成する必要がありますClone()

Clone()10個の派生クラスすべてにサービスを提供する基本クラスに単一のメソッドを作成する方法はありますか?

編集:オブジェクトの1つを介してクラスのコンストラクターを呼び出す方法はありますか?実際の派生クラスコンストラクターを呼び出す方法で。何かのようなもの:

MyClass ^obj2 = obj1->Class->Construct(arg1, arg2);

私はC++/ CLIでこれを行っていますが、他の言語からの回答も歓迎します。

4

4 に答える 4

4

昔ながらのC++では、コンパイル時のポリモーフィズム(不思議なことに繰り返されるテンプレートパターン)を使用してこれを行うことができます。派生クラスがコピー可能であると仮定すると、次のように書くことができます。


class Base
{
public:
    virtual Base* Clone() const = 0;
//etc.
};
template <typename Derived>
class BaseHelper: public Base
{
    //other base code here

    //This is a covariant return type, allowed in standard C++
    Derived * Clone() const
    {
         return new Derived(static_cast<Derived *>(*this));
    }
};

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


class MyClass: public BaseHelper<MyClass>
{
    //MyClass automatically gets a Clone method with the right signature
};

クラスから再度派生してシームレスに機能させることはできないことに注意してください。中間クラスをテンプレート化して再度派生するオプションを「設計」するか、書き直しを再開する必要がありCloneます。

于 2009-05-19T12:46:13.557 に答える
0

うーん、ここでファクトリパターンが使えると思います。すなわち:

MyClass Clone(){
    return MyClassFactory.createInstance(this.getClass(), this.member1, this.member2, ...);
}

ファクトリでは、渡されたクラスタイプに基づいてサブクラスのインスタンスを作成する必要があります。したがって、おそらくそれはあなたのアプローチと同じ欠点を持っています。

于 2009-05-19T12:19:19.693 に答える
0

私が知っているC++ではありません。あなたが言うように、Clone()の各実装で異なるクラスのオブジェクトを作成する必要があります。

于 2009-05-19T12:12:09.677 に答える
0

代わりにコピーコンストラクターを使用することをお勧めします(派生クラスは基本実装のコピーコンストラクターも呼び出すことができるため)。これも、C++プログラマーにとってなじみのある領域であるため便利です。

このインスタンスでは、リフレクションを使用してコピーコンストラクターを呼び出す単一のCloneメソッドを作成できる場合があります。

Cloneおそらく、ジェフリー・リッチターがフレームワーク設計ガイドラインの本で次のように述べていることも注目に値します。「ICloneableインターフェースは、明示的に文書化されていないコントラクトを使用した非常に単純な抽象化の例です。オブジェクト、一部の実装はディープコピーを実行します。このインターフェイスのCloneメソッドが実行する必要があることは完全に文書化されていないため、を実装するタイプのオブジェクトを使用すると、ICloneable何を取得するかがわかりません。これにより、インターフェイスが役に立たなくなります。 " (強調鉱山)

于 2009-05-19T12:27:57.553 に答える