2013-03-18 8 views
5

Im Anschluss an diese Website erstellen: http://www.csharp411.com/c-object-clone-wars/Wie man manuell eine tiefe Kopie

ich manuell entschieden (folgende Seite 1. Clone manuell) eine tiefe Kopie meiner Klasse. Ich habe die Klonschnittstelle und alle notwendigen Eigenschaften implementiert. Ich habe mein Programm ausgeführt und überprüft, ob mein Klon tatsächlich auch der Originalinstanz entspricht. Das war richtig.

Allerdings bezieht sich meine neue Instanz immer noch auf die ursprüngliche. So wurden alle Änderungen in meiner Kopie in die ursprüngliche Instanz reflektiert.

Also wenn das nicht eine tiefe Kopie erstellt, was dann? Was hätte schiefgehen können?

(Ich möchte eine tiefe Kopie machen manuell meine Leistung zu erhöhen, so will ich nicht die ObjectCopier Klasse. (auch wenn es funktioniert gut, es dauert 90% meiner Code Laufzeit).

Code Snippets:

Klasse implementiert:

public class SudokuAlgorithmNorvig: ICloneable 
{ 

Clone-Methode:

Clone Methodenaufruf:

SudokuAlgorithmNorvig sudokuCopy = (SudokuAlgorithmNorvig)sudoku.Clone() 

habe ich die gleiche (Implementierung und Einstellung Klon-Methode) in allen meinen anderen Klassen. (Field + Coordinate)

+2

Wir müssen Ihren Code sehen, um zu sehen, was schief gelaufen ist. Das kürzeste Codebeispiel, das das Problem aufweist, wäre am besten. –

+1

Ja, realisierte das :) Implementiere es jetzt, danke – dylanmensaert

+1

Ok, es sieht so aus, als ob du nur einen flachen Klon des Objekts machst. Zum Beispiel, 'sudokuClone.Grid = (Feld [,]) this.Grid' zeigt NICHT' sudokuClone.Grid' auf eine neue Kopie! –

Antwort

3

Es sieht so aus, als ob Sie überall auf vorhandene Objekte verweisen, anstatt Kopien zu erstellen.

Sind BlockRows und BlockColumns benutzerdefinierte Objekte, die Sie in das neue Objekt übergeben? Diese sind nur Verweise auf BlockRows und BlockColumns in dem vorhandenen Objekt, so dass das Ändern eines dieser Exemplare im ersten Objekt in dem zweiten widergespiegelt wird.

Ich weiß nicht, was Grid, Peers und Units darstellen, aber diese werden höchstwahrscheinlich auch Referenzen sein. Sie müssen alle diese Klassen auch klonbar machen. Andernfalls ändert die Änderung Grid in der ersten Instanz Ihrer SudokuAlgorithmNorvig-Klasse die entsprechende Grid in der zweiten Instanz.

+0

Nun, blockrows und blockcolumns werden im Konstruktor von SudokuAlgorithmNorvig gesetzt. Ich weiß also nicht, wie ich das klonen soll. – dylanmensaert

+0

Machen Sie sie auch klonbar und übergeben Sie 'BlockRows.Clone()' und 'BlockColumns.Clone() 'in den Konstruktor der neuen Instanz. –

+0

Grid ist ein zweidimensionales Array vom Typ Field (benutzerdefinierte Klasse, in der ich den Klon auf die gleiche Weise implementiert habe). Peers und Units sind Hashmaps, die ebenfalls aus Field bestehen. Muss ich etwas Besonderes mit hashmap und array machen, um klonen zu können? – dylanmensaert