2010-02-04 11 views
30

Esiste un riferimento definitivo a questo riguardo nella programmazione?Qual è la differenza tra copia e clonazione?

Vedo che molte persone si riferiscono alla copia e alla clonazione come la stessa cosa. È vero?

È dipendente dalla lingua?

Un piccolo punto, ma mi dava fastidio ...

+3

Non credo che ci sia un chiaro consenso sul loro significato relativo. –

risposta

26

Non non c'è nessuna definizione formale di questi concetti, almeno uno che abbraccia tutte le lingue.

Che di solito è comune, anche se:

  • clone - creare qualcosa di nuovo sulla base di qualcosa che esiste.
  • copia - copia da qualcosa che esiste a qualcos'altro (che già esiste già).
1

In C++ - terra "clonazione" di solito è di idioma per gli oggetti in profondità di copiatura classi polimorfiche.

In Java/C# ho il sospetto che questi termini siano usati in modo più intercambiabile.

2

Direi che copia e clonazione sono termini analoghi. L'unica cosa che dovresti forse essere consapevole è che ottieni una copia superficiale e una copia profonda. La copia superficiale crea solo una copia di un oggetto al livello di root, dove una copia profonda produrrà una copia di un oggetto e tutti i suoi oggetti figli.

9

Sì, c'è una differenza. Per quanto riguarda le dipendenze linguistiche, alcune lingue possono eseguire tutte le operazioni di copia superficiale, profonda, pigra. Alcuni fanno solo copie poco profonde. Quindi sì, a volte dipende dal linguaggio.

Ora, pensiamo ad esempio un array:

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

La matrice “numbersCopy” ora contiene gli stessi valori, ma soprattutto l'oggetto matrice stessa rileva allo stesso riferimento oggetto come matrice “numeri”.

Quindi, se dovessi fare qualcosa di simile:

numbersCopy[2] = 0; 

Quale sarebbe l'uscita per le seguenti affermazioni?

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

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

Considerando entrambe le matrici puntare allo stesso riferimento si otterrebbe:

Ma se vogliamo fare una copia distinta del primo array con un proprio riferimento? Bene in quel caso vorremmo clonare la matrice. In tal modo ogni array avrà ora il proprio riferimento all'oggetto. Vediamo come funzionerà.

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

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

La matrice “numbersClone” ora contiene gli stessi valori, ma in questo caso l'oggetto matrice stessa rileva un riferimento diverso da matrice “numeri”.

Quindi, se dovessi fare qualcosa di simile:

numbersClone[2] = 0; 

Quale sarebbe l'uscita ora le seguenti affermazioni?

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

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

avete indovinato:

Source

3

più concisa:

  • copia: replicare a un'istanza esistente (superficiale o profondo)
  • clone: ​​replicare nuova istanza (sempre in profondità)

Nessun consenso come sviluppatori sloppily scambiarli; tuttavia si potrebbe basarsi su quanto sopra basato su:

  1. Etimologia (Biologia) implica che la nozione di "clone superficiale" è priva di senso poiché non geneticamente identica; la clonazione implica la completezza al fine di propagare l'entità.
  2. La copia implica storicamente la replica su un supporto esistente (copia di un libro o di un dipinto, ecc.) Ad esempio, una fotocopia copia un'immagine su un foglio di carta esistente; se si potesse in qualche modo clonare un pezzo di carta, il risultato sarebbe un nuovo pezzo di carta.
  3. Uno potrebbe "copiare" un riferimento a un oggetto ma non "clonerà" mai un riferimento a un oggetto.
Problemi correlati