1

クラス Graph があり、そのグラフのコピーが必要です。グラフ オブジェクトの内部を変更します (例: エッジの削除など)。グラフを実装するには 2 つの方法があります。

  1. コピー コンストラクター
  2. 「getGraph() { return new Graph(this)}」というメソッド。このメソッド getGraph は防御コピーを実行できます。

私の理解では、コピー コンストラクターの唯一の利点は、自由にコピーできることです。これは、グラフ オブジェクトを変更したくない場合、「getGraph」で防御コピーを行う必要がないことを意味します。

ここで私の質問に戻ります。

  1. コピー コンストラクターを使用する方が良いですか、それとも self オブジェクトのコピーを返す関数を使用する方が良いですか?
  2. なんで ?
4

4 に答える 4

2

これが何のために必要なのかわからない場合は、潜在的なサブクラスがメソッドをオーバーライドできるため、コピーをメソッドとして定義することをお勧めします。たとえば、各ノードに色を追加するサブクラスがある場合Graph、コピー コンストラクターを呼び出すとGraph、プレーン グラフしかコピーできず、サブクラスの追加情報と機能が失われます。一方、グラフをコピーするメソッドは、サブクラスでオーバーライドできます。

このメソッドは役立つかもしれませんが、その要件 (メソッドを実装してオーバーライドする必要がある) と制限 (浅いコピーしか作成しない)Object.cloneを念頭に置いて、コピー メソッドを最初から作成することもできます。Clonebleclone

于 2013-08-22T06:36:19.453 に答える
1

私があなたの質問を理解する限り

コピーコンストラクターでは、次のようにします

Graph copy = new Graph(objectToBeCloned);

そして getGraph() であなたはするでしょう

Graph copy = objectToBeCloned.getGraph();

Graph クラスにCloneableインターフェースを実装させ、メソッドをオーバーライドclone() して、必要なディープ コピーを取得することをお勧めします。

于 2013-08-22T06:35:47.103 に答える
1

コピー コンストラクターには、Graph オブジェクト内の getGraph メソッドよりも多くのセマンティクスがあると言えます。したがって、2 つの間では、コピー コンストラクターを使用することをお勧めします。

クローンの使用は考慮しないでください。これは設計上壊れています。詳細については、オブジェクト IDを参照してください。ここで表現されているいくつかの代替手段もあります:クローン対コピーコンストラクター

于 2013-08-22T08:41:31.233 に答える