2009-11-17 4 views
8

Che cos'è la clonazione di oggetti in vb6 o java? In che situazione usiamo un clone? Cosa significano gli oggetti della clonazione? Qualcuno può dirmi con l'esempio per favore.Cosa significa clonare() un oggetto?

+1

Sembra ovvio per le persone con esperienza, ma i principianti spesso lottano con "hey, perché il mio oggetto cambia quando ho cambiato questo 'altro'". La consapevolezza del fatto che i nomi sono essenzialmente puntatori a puntini viene lentamente (e la comprensione della clonazione accelera notevolmente tale processo). –

risposta

11

La clonazione sta in realtà copiando i dati dell'oggetto in un nuovo oggetto.

questo esempio non clonare i dati:

Foo p = new Foo(); 
Foo o = p; 

Se Foo ha un membro a e si cambia p.a poi o.a cambia anche perché sia ​​p e o punto allo stesso oggetto.

Tuttavia,

Foo p = new Foo(); 
Foo o = p.Clone(); 

In questo caso, se si cambia p.a poi o.a rimane lo stesso perché in realtà puntano a separare gli oggetti.

Esistono due modi diversi per clonare: clone poco profondo o clone profondo.

Un clone poco profondo crea un nuovo oggetto e copia i membri nel nuovo oggetto. Ciò significa che se uno dei membri è effettivamente un puntatore a un altro oggetto, quell'oggetto sarà condiviso tra il vecchio oggetto e il nuovo oggetto.

Un clone profondo passa effettivamente e clona tutti i membri nel nuovo oggetto. In questo modo gli oggetti sono copie complete di tutti i dati.

+0

BTW, c'è un terzo modo di clonazione: un clone a livello semantico. Un clone di livello semantico ad es. un elenco sarebbe un nuovo elenco contenente gli stessi elementi di quello precedente. – supercat

+0

@supercat - come è diverso da un clone superficiale della lista? – Aaron

+0

@Aaron: Supponiamo che una raccolta sia implementata come riferimento a un array insieme al numero di elementi validi. Un clone superficiale di un oggetto che contiene una tale collezione sarebbe un nuovo oggetto con un numero di elementi validi copiato ma un riferimento alla stessa serie di elementi dell'originale. Un clone di livello sematico avrebbe un conteggio copiato e un riferimento al clone superficiale dell'array. – supercat

2

Gli oggetti di lingua generale vengono passati per riferimento. Quindi se dici $objB=$objA non ottieni un nuovo oggetto; stai ricevendo un nuovo nome per lo stesso oggetto. Tuttavia, se si dice $objB= clone $objA si ottiene una copia di $objA. Nel primo caso, qualunque cosa tu faccia a $objB accade anche a $objA. Nel secondo caso, $objB è indipendente.