2009-11-17 27 views
8

¿Qué es la clonación de objetos en vb6 o java? ¿En qué situación usamos un clon? ¿Qué significan los objetos de clonación? ¿Puede alguien decirme con el ejemplo, por favor?¿Qué significa clonar() un objeto?

+1

Parece obvio para personas experimentadas, pero los principiantes a menudo luchan con "hey, ¿por qué mi objeto cambió cuando cambié este 'otro'?". La comprensión de que los nombres son básicamente punteros aglutinados viene lentamente (y la comprensión de la clonación acelera enormemente ese proceso). –

Respuesta

11

La clonación consiste en copiar los datos del objeto en un nuevo objeto.

Este ejemplo no clonar los datos:

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

Si Foo tiene un miembro a y se cambia a continuación p.ao.a cambios también porque ambos p y o apuntan al mismo objeto.

Sin embargo,

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

En este caso, si se cambia p.a continuación o.a sigue siendo el mismo, ya que en realidad apuntan a separar objetos.

En realidad, hay dos maneras diferentes de clonar: clon superficial o clon profundo.

Un clon superficial solo hace un objeto nuevo y copia los miembros en el nuevo objeto. Esto significa que si uno de los miembros es realmente un puntero a otro objeto, ese objeto se compartirá entre el objeto antiguo y el nuevo.

Un clon profundo realmente atraviesa y clona todos los miembros en el nuevo objeto. De esa forma, los objetos son copias completas de todos los datos.

+0

Por cierto, hay una tercera forma de clonación: un clon de nivel semántico. Un clon de nivel semántico de, p. a List sería una nueva lista que contiene los mismos elementos que la anterior. – supercat

+0

@supercat - ¿Cómo es eso diferente a un clon superficial de la lista? – Aaron

+0

@ Aaron: Supongamos que una colección se implementa como una referencia a una matriz junto con un recuento de cuántos elementos son válidos. Un clon superficial de un objeto que contiene dicha colección sería un nuevo objeto con un recuento de elementos válidos copiados pero una referencia a la misma matriz de elementos que el original. Un clon de nivel sematic tendría un recuento copiado y una referencia a un clon superficial de la matriz. – supercat

2

Generalmente, los objetos que hablan se pasan por referencia. Entonces, si dices $objB=$objA, no obtienes un objeto nuevo; está obteniendo un nuevo nombre para el mismo objeto. Sin embargo, si dices $objB= clone $objA obtienes una copia de $objA. En el primer caso, haga lo que haga en $objB, también pasa al $objA. En el segundo caso, $objB es independiente.