2013-03-18 13 views
5

następstwie tej strony: http://www.csharp411.com/c-object-clone-wars/Jak ręcznie utworzyć kopię głęboki

postanowiłem ręcznie utworzyć głęboką kopię mojej klasie (po stronie 1. Clone ręcznie). Zaimplementowałem interfejs klona i wszelkie niezbędne właściwości. Wykonałem mój program i sprawdziłem, czy mój klon jest rzeczywiście równy pierwotnej instancji. To było poprawne.

Jednak moja nowa instancja wciąż odnosiła się do oryginalnej. Więc wszelkie zmiany w mojej kopii, które zostały odzwierciedlone w oryginalnej instancji.

Więc jeśli to nie tworzy głębokiej kopii, to co? Co mogło pójść nie tak?

(Chcę, aby głęboka kopia ręcznie, aby zwiększyć swoją wydajność, więc nie chcę użyć klasy ObjectCopier. (nawet jeśli to działa świetnie, zajmuje 90% mojego kodu czasie wykonywania).

Fragmenty kodu:

implementuje klasa: metoda

public class SudokuAlgorithmNorvig: ICloneable 
{ 

Clone: ​​

Metoda 0
public object Clone() 
    { 
     SudokuAlgorithmNorvig sudokuClone = new SudokuAlgorithmNorvig(this.BlockRows, this.BlockColumns); 

     sudokuClone.IsSucces = this.IsSucces; 

     if (this.Grid != null) sudokuClone.Grid = (Field[,])this.Grid; 
     if (this.Peers != null) sudokuClone.Peers = (Hashtable)this.Peers; 
     if (this.Units != null) sudokuClone.Units = (Hashtable)this.Units; 

     return sudokuClone; 
    } 

Clone wezwanie:

SudokuAlgorithmNorvig sudokuCopy = (SudokuAlgorithmNorvig)sudoku.Clone() 

zrobiłam sama (wykonawczą i ustawienie metody clone) we wszystkich moich innych klas. (Field + Coordinate)

+2

Musimy zobaczyć Twój kod, aby zobaczyć, co poszło nie tak. Najkrótsza próbka kodu, która wykazuje problem, byłaby najlepsza. –

+1

Tak, zdałem sobie sprawę, że :) Wdraż go teraz, dzięki – dylanmensaert

+1

OK, wygląda na to, że robisz tylko płytki klon obiektu. Na przykład 'sudokuClone.Grid = (Field [,]) this.Grid' NIE wskazuje' sudokuClone.Grid' na nową kopię! –

Odpowiedz

3

Wygląda na to, że zamiast tworzyć kopie, tworzone są odniesienia do istniejących obiektów w całym miejscu.

Czy BlockRows i BlockColumns niestandardowych obiektów, które przechodzisz do nowego obiektu? Będą to po prostu odniesienia do BlockRows i BlockColumns w istniejącym obiekcie, więc zmiana jednej z tych instancji w pierwszym obiekcie zostanie odzwierciedlona w drugim.

Nie wiem, co oznaczają: Grid, Peers i Units, ale najprawdopodobniej będą to również odniesienia. Musisz również uczynić wszystkie te klasy klonowalnymi. W przeciwnym razie zmiana Grid w pierwszej instancji twojej klasy SudokuAlgorithmNorvig spowoduje zmianę odpowiadającej Grid w drugiej instancji.

+0

Cóż, blockrows i blockcolumns są ustawiane w konstruktorze SudokuAlgorithmNorvig. Tak naprawdę nie wiem, jak to sklonować. – dylanmensaert

+0

Uczyń je również klonowalnymi i przekaż 'BlockRows.Clone()' i 'BlockColumns.Clone() 'do konstruktora nowej instancji. –

+0

Grid to dwuwymiarowa tablica typu Field (klasa niestandardowa, w której zaimplementowałem klon w ten sam sposób). Równania i Jednostki są hashmapami, które również składają się z Pola. Czy muszę zrobić coś specjalnego z hashmap i tablicą, aby móc klonować? – dylanmensaert