5

所有していない変数を持つオブジェクトがあるとします。つまり、変数は、 compositionではなくaggregationによって構成されます。ディープコピー操作は変数をコピーしますか、それとも変数へのリンクのみをコピーしますか?

4

2 に答える 2

4

ここで、ディープ コピーのコンテキストで構成と集約の役割を区別している点が気に入っています。

私は他の答えに反対して言います:いいえ、オブジェクトはそれが所有していない別のオブジェクトをディープコピーすべきではありません。

オブジェクトのディープ コピーは、(少なくとも最初は) オリジナルと同一であることが期待されます。オリジナルが所有していない参照からディープ コピーが作成された場合、新しいコピーを所有するのは誰かという問題が残ります。クローンがそれを所有している場合、元のオブジェクトと同一ではありません。集約されたメンバーの 1 つへの参照を所有することを除いて、元のオブジェクトと同様のオブジェクトになります。これは間違いなく混乱を招くでしょう。クローンがそれを所有していない場合、誰が所有していますか?

この所有権の問題は、ガベージ コレクションのない言語では特に重要ですが、ガベージ コレクタでも問題が生じます。たとえば、クローンがオブジェクトへのコミットされていない変更を許可するように作成されている場合、それが参照する他のオブジェクトへの変更は許可されますか? 変更が許可されていない場合、それをディープ コピーする理由はありません。変更が許可されている場合、変更されているオブジェクトはこの参照されたオブジェクトを制御しないため、それらの変更はどのようにコミットされるのでしょうか? 確かに、このメカニズムを工夫することはできますが、それはクローン オブジェクトがその責任を超えていることを意味し、プログラムはメンテナンスの悪夢になるでしょう。

所有されていないオブジェクトを含むディープ コピー操作は、無限の (または少なくとも過剰な) コピー操作の問題にもつながります。オブジェクトがコレクションの一部であり、さらにオブジェクトがコレクションへの参照を必要とするとします。そのオブジェクトに対する単純なディープ コピー操作により、コレクションとその各メンバーの新しいコピーが作成されます。無限再帰の問題を回避し、この新しいオブジェクトのセット間ですべての参照の一貫性を保つと仮定しても、ほとんどの目的にとってはまだ過剰であり、新しいコレクションが必要な場合には、もっと理にかなっているのではないでしょうか?この目的のために、そのメンバーの 1 つではなく、コレクション自体をディープ コピーしますか?

あなたが示唆するように、所有されているオブジェクトのみを含むディープコピーは、ほとんどの目的にとって唯一の健全なアプローチだと思います。

于 2010-08-26T19:12:25.950 に答える
1

浅いものの反対側の深いコピーでは、オブジェクト全体を再帰的に地面にコピーし、オブジェクトと含まれているすべてのオブジェクトの完全に新しいコピーを作成する必要があります。

そうです、リンクだけでなく変数もコピーする必要があります。

于 2010-07-28T08:29:36.953 に答える