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?
Respuesta
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.
¡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. –
¿Cómo te gusta mi respuesta en http://stackoverflow.com/a/12187738/363751 a una pregunta similar? – supercat
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 ..
- 1. copia profunda vs copia superficial
- 2. Copia de estructura profunda
- 3. ¿Hace Enumerable.Repeat() una copia profunda?
- 4. copia profunda en C#
- 5. Copia profunda en JPA
- 6. ¿SqlCommand.Clone() crea una copia profunda o una copia superficial?
- 7. BeanUtils.cloneBean() copia profunda
- 8. Crear una copia profunda en C#
- 9. Ayuda con copia y copia profunda en Python
- 10. C: Haciendo una copia profunda de una estructura ... haciendo una copia superficial de una estructura
- 11. argumentos de multiprocesamiento de python: ¿copia profunda?
- 12. copia profunda de PHP matriz de referencias
- 13. Copia profunda duplicada() de ByteBuffer de Java
- 14. Copia profunda de un objeto C#
- 15. Copia profunda de matrices en Ruby
- 16. Enhebrado trenzado cómo evitar la copia profunda
- 17. C# - Esperando que se complete una operación de copia
- 18. std vector C++ - copia profunda o superficial
- 19. ¿Cómo hacer una copia profunda de una matriz?
- 20. NSString copia no copia?
- 21. Copia profunda de una instancia de clase .NET sin serialización
- 22. Cómo hacer una copia profunda de NSManagedObject en Core Data
- 23. Cómo hacer una copia profunda de un InputStream en Java
- 24. Escribir una copia profunda - copiando el valor del puntero
- 25. ¿Scala AnyRef.clone realiza una copia superficial o profunda?
- 26. ¿El método de clonación en la matriz es una copia profunda o poco profunda?
- 27. C++: Copia profunda de un puntero de clase base
- 28. constructor de copia: copia completa una clase abstracta
- 29. Una operación de copia de archivo atómica segura
- 30. Copia profunda de nodos de vista de árbol
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. –
@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". –