2010-07-28 9 views
5

Dado un objeto que tiene una variable que no posee; es decir, la variable está compuesta por aggregation en lugar de composition. ¿Copiará la operación de copia profunda la variable o solo el enlace?¿Una operación de copia profunda copia recursivamente subvariables que no posee?

+0

Tal vez sea suficiente con preguntas sobre copias profundas o superficiales, a menos que esté preparado para definir sus términos mucho más claramente. –

+0

@Neil Butterworth: De hecho, eso es precisamente lo que me gustaría aprender. Tengo la impresión de que la copia profunda y superficial son términos vagamente definidos. En las respuestas a mi pregunta original sobre [Copy constructor versus Clone] (http://stackoverflow.com/questions/3345389/copy-constructor-versus-clone) todos coincidieron en que es una diferencia importante, aunque creo que solo hay una única forma de copiar objetos que generalmente es útil. Es por eso que comencé una pequeña investigación después de lo que comúnmente se entiende por "copia profunda" y "copia superficial". –

Respuesta

4

me gusta la distinción que usted está haciendo aquí entre el papel de composición y agregación en el contexto de una copia profunda.

Voy a ir en contra de la otra respuesta y decir: no, un objeto no debe copiar a fondo otro objeto que no le pertenece.

Uno esperaría que una copia profunda de un objeto sea (al menos inicialmente) idéntica a la original. Si se hizo una copia profunda de una referencia que el original no poseía, esto deja abierta la cuestión de qué posee la nueva copia. Si el clon lo posee, entonces no sería idéntico al objeto original. Sería un objeto como el original, excepto que posee la referencia a uno de sus miembros agregados. Esto seguramente llevaría al caos. Si el clon no es el propietario, ¿quién lo hace?

Este problema de propiedad es especialmente importante en los lenguajes no recogidos de basura, pero también crea problemas incluso con un recolector de basura. Por ejemplo, si el clon está hecho para permitir cambios no confirmados a un objeto, ¿se permiten cambios en este otro objeto al que hace referencia? Si los cambios no están permitidos, entonces no hay razón para copiarlos en profundidad. Si se permiten cambios, ¿cómo se comprometerán esos cambios, ya que el objeto que se está modificando no controla este objeto al que se hace referencia? Claro, se podría idear un mecanismo para esto, pero significaría groseramente que el objeto clonado está sobrepasando sus responsabilidades, y el programa sería una pesadilla de mantenimiento.

Una operación de copia profunda que incluye objetos no propietarios también conduce a problemas de operaciones de copia infinitas (o al menos excesivas). Supongamos que un objeto es parte de una colección, y además supongamos que el objeto requiere una referencia a la colección. Una operación ingenua de copia profunda de ese objeto crearía una nueva copia de la colección y cada uno de sus miembros. Incluso suponiendo que evitemos el problema de la recursión infinita y que conservemos todas las referencias consistentes entre este nuevo conjunto de objetos, sigue siendo excesivo para la mayoría de los propósitos, y para aquellos casos en los que se desea una nueva colección, ¿no tendría más sentido? para copiar a fondo la colección en sí, en lugar de uno de sus miembros, para este propósito?

Creo que una copia profunda que solo incluye objetos propios, como usted sugiere, es el único enfoque sensato para la mayoría de los propósitos.

+0

¡Gracias por tu excelente respuesta! Me gusta especialmente tu ejemplo de recursión infinita mientras hago una copia profunda. Este es realmente un caso que requiere la repetición de copia profunda para omitir objetos agregados. –

+0

¿Cómo te gusta mi respuesta en http://stackoverflow.com/a/12187738/363751 a una pregunta similar? – supercat

1

Copia profunda opuesta a la somera debe copiar todo el objeto recursivamente en el suelo y hacer una copia completamente nueva del objeto y todos los objetos contenidos.

Así que sí, se debe copiar variables, no sólo los enlaces ..

Cuestiones relacionadas