2010-07-28 10 views
5

Gegeben ein Objekt, das eine Variable besitzt, die es nicht besitzt; Das heißt, die Variable besteht aus aggregation statt composition. Wird bei einem tiefen Kopiervorgang die Variable oder nur der Link zu ihr kopiert?Kopiert eine tiefe Kopieroperation Untervariablen rekursiv, die ihr nicht gehören?

+0

Vielleicht sind das genug tiefe/flache Fragen - es sei denn, Sie sind bereit, Ihre Begriffe viel klarer zu definieren. –

+0

@Neil Butterworth: Genau das würde ich gerne lernen. Ich habe den Eindruck, dass tiefe und oberflächliche Kopien lose definierte Begriffe sind. In den Antworten auf meine ursprüngliche Frage über [Konstruktor gegen Klon kopieren] (http://stackoverflow.com/questions/3345389/copy-constructor-versus-clone) stimmten alle zu, dass es ein wichtiger Unterschied ist, obwohl ich denke, dass es nur einen gibt Einfacher Weg zum Kopieren von Objekten, der allgemein nützlich ist. Deshalb habe ich nach dem, was man unter "Deep Copy" und "Shallow Copy" versteht, eine kleine Untersuchung gestartet. –

Antwort

4

Ich mag die Unterscheidung, die Sie hier zwischen der Rolle der Zusammensetzung und Aggregation im Zusammenhang mit einer tiefen Kopie machen.

Ich werde gegen die andere Antwort gehen und sagen: Nein, ein Objekt sollte ein anderes Objekt, das es nicht besitzt, nicht tief kopieren.

Man würde erwarten, dass eine tiefe Kopie eines Objekts (zumindest anfänglich) mit dem Original identisch ist. Wenn eine tiefe Kopie einer Referenz erstellt wurde, die das Original nicht besaß, bleibt die Frage offen, was die neue Kopie besitzt. Wenn der Klon es besitzt, wäre es nicht identisch mit dem ursprünglichen Objekt. Es wäre ein Objekt wie das Original, außer dass es den Verweis auf eines seiner aggregierten Mitglieder besitzt. Dies würde sicherlich zu Chaos führen. Wenn der Klon es nicht besitzt, wer dann?

Dieses Problem der Eigentumsrechte ist besonders in Nicht-Garbage-Collected-Sprachen wichtig, verursacht aber auch Probleme mit einem Garbage Collector. Wenn der Klon beispielsweise nicht festgeschriebene Änderungen an einem Objekt zulässt, müssen Änderungen an diesem anderen Objekt zulässig sein, auf das es verweist? Wenn Änderungen nicht erlaubt sind, gab es keinen Grund, sie tief zu kopieren. Wenn Änderungen erlaubt sind, wie sollen diese Änderungen festgeschrieben werden, da das Objekt, das geändert wird, dieses referenzierte Objekt nicht steuert? Sicher, ein Mechanismus dafür könnte erfunden werden, aber es würde sicher bedeuten, dass das geklonte Objekt seine Verantwortung überschreitet, und das Programm wäre ein Wartungsalbtraum.

Ein Deep-Copy-Vorgang, der auch nicht zugeordnete Objekte enthält, führt ebenfalls zu Problemen mit unendlichen (oder zumindest übermäßigen) Kopiervorgängen. Angenommen, ein Objekt ist Teil einer Sammlung und nimmt ferner an, dass das Objekt eine Referenz auf die Sammlung benötigt. Eine naive Deep-Copy-Operation für dieses Objekt würde dann eine neue Kopie der Sammlung und jedes ihrer Mitglieder erstellen. Selbst unter der Annahme, dass wir das Problem der unendlichen Rekursion vermeiden und alle Verweise auf diese neue Gruppe von Objekten konsistent halten, ist es für die meisten Zwecke immer noch übertrieben, und für die Fälle, in denen eine neue Sammlung gewünscht wird, wäre es nicht sinnvoller die Sammlung selbst und nicht eines ihrer Mitglieder zu diesem Zweck zu vervielfältigen?

Ich denke, eine Deep-Kopie, die nur im Besitz befindliche Objekte enthält, wie Sie vorschlagen, ist der einzige vernünftige Ansatz für die meisten Zwecke.

+0

Vielen Dank für Ihre tolle Antwort! Ich mag besonders dein Beispiel der unendlichen Rekursion, während du einen tiefen Klon machst. Dies ist in der Tat ein Fall, der erfordert, dass die Rekursion der tiefen Kopie aggregierte Objekte überspringt. –

+0

Wie gefällt Ihnen meine Antwort auf http://StackOverflow.com/A/12187738/363751 auf eine ähnliche Frage? – supercat

1

Tiefe Kopie in Gegensatz zu flachen sollte das ganze Objekt rekursiv auf den Boden kopieren und eine komplett neue Kopie des Objekts und aller enthaltenen Objekte erstellen.

Also ja, sollte es Variablen kopieren, nicht nur Links ..

Verwandte Themen