2010-02-04 27 views
30

Czy istnieje ostateczne odniesienie do tego w programowaniu?Jaka jest różnica między kopiowaniem a klonowaniem?

Widzę, że wiele osób odnosi się do głębokiego kopiowania i klonowania jako tej samej rzeczy. Czy to prawda?

Czy jest zależny od języka?

mały punkt, ale to mnie niepokoi ...

+3

Nie sądzę, że istnieje wyraźny konsensus co do ich względnego znaczenia. –

Odpowiedz

26

Nie ma formalnej definicji tych pojęć, conajmniej nie taki, który obejmuje wszystkie języki.

Co znajduje się zazwyczaj wspólny choć:

  • klon - stworzyć coś nowego na podstawie czegoś, co istnieje.
  • kopiowanie - kopiowanie z czegoś, co istnieje do czegoś innego (które już istnieje).
1

W C++ - ziemi „klonowanie” jest zwykle idiom dla obiektów głębokie kopiowanie polimorficzne klas.

W języku Java/C# Podejrzewam, że terminy te są używane zamiennie.

2

Powiedziałbym, że kopiowanie i klonowanie są analogicznymi terminami. Jedyną rzeczą, którą powinieneś być świadomy, jest to, że dostajesz płytką kopię i głęboką kopię. Płytka kopia tworzy tylko kopię obiektu na poziomie katalogu głównego, gdzie jako głęboka kopia tworzy kopię obiektu i wszystkich jego obiektów podrzędnych.

9

Tak, jest różnica. Jeśli chodzi o zależności językowe, niektóre języki mogą wykonywać kopiowanie Shallow, Deep i Lazy. Niektóre robią tylko Płytkie kopie. Więc tak, czasami jest zależny od języka.

Teraz Weźmy na przykład tablicy:

int [] numbers = { 2, 3, 4, 5}; 
int [] numbersCopy = numbers; 

W „numbersCopy” tablica zawiera teraz te same wartości, ale co ważniejsze, sam obiekt tablica wskazuje na tego samego odwołania do obiektu jako „numbers” tablicy.

Więc jeśli miałbym zrobić coś takiego:

numbersCopy[2] = 0; 

co byłoby wyjście z następującymi stwierdzeniami?

System.out.println(numbers[2]); 

    System.out.println(numbersCopy[2]); 

Biorąc pod uwagę obie tablice wskazują na ten sam odniesienia chcielibyśmy dostać:

Ale co, jeśli chcemy mieć wyraźną kopię pierwszej tablicy z własnej odniesienie? W takim przypadku chcielibyśmy sklonować tablicę. W ten sposób każda tablica będzie miała teraz swoje własne odniesienie do obiektu. Zobaczmy, jak to zadziała.

int [] numbers = { 2, 3, 4, 5}; 

    int [] numbersClone = (int[])numbers.clone(); 

przycisków „numbersClone” tablica zawiera teraz te same wartości, ale w tym przypadku sama matryca obiektu wskazuje innym numerem niż „Numery” tablicy.

Więc jeśli miałbym zrobić coś takiego:

numbersClone[2] = 0; 

Co byłoby wyjście teraz do poniższych stwierdzeń?

System.out.println(numbers[2]); 

    System.out.println(numbersClone[2]); 

Zgadłeś:

Source

3

Najbardziej zwięzły:

  • kopia: powielać istniejących instancji (płytkie lub głębokie)
  • klon: replikować do nowej instancji (zawsze głębokim)

Brak konsensusu jako twórców niechlujnie wymieniaj je; jednak jeden mógłby lobbować powyższym na podstawie:

  1. etymologii (Biology) wynika, że ​​pojęcie „płytkiej klonem” jest bezsensowne, ponieważ nie genetycznie identyczne; klonowanie implikuje kompletność w celu propagowania bytu.
  2. Kopiowanie historycznie oznacza replikację na istniejącym nośniku (kopiowanie książki lub malowania itp.), Np. Fotokopia kopiuje obraz na istniejący kawałek papieru; gdyby można było jakoś sklonować kawałek papieru, powstałby nowy kawałek papieru.
  3. Można "skopiować" odniesienie do obiektu, ale nigdy nie "klonowano" odniesienia do obiektu.
Powiązane problemy