A menudo veo constructores de copia sugirieron como alternativa a un método de clonación, pero con la excepción de clases cerradas los comportamientos son muy diferentes. Si tengo un tipo Car, que simplemente admite propiedades VIN, BodyColor y BodyStyle, y un tipo derivado FancyCar, que también es compatible con InteriorFabric y SoundSystem, entonces el código que acepta un objeto de tipo Car y usa el constructor copia de coche para duplicarlo terminará arriba con un auto Si se pasa un FancyCar a dicho código, el "duplicado" resultante será un nuevo automóvil, que tiene un VIN, BodyColor y BodyStyle que coincide con el automóvil original, pero que no tendrá InteriorFabric o SoundSystem. Por el contrario, el código debía aceptar un automóvil y usar un método de clonación en él, pasar un FancyCar al código provocaría la producción de un FancyCar.
A menos que uno desee usar Reflection, cualquier método de clonación debe incluir en su base una llamada a base.MemberwiseClone. Como MemberwiseClone no es un método virtual, sugeriría definir un método de clonación virtual protegido; Es posible que también desee evitar que las clases secundarias llamen a MemberwiseClone definiendo una clase anidada de ámbito protegido con el mismo nombre (por lo tanto, si una clase descendiente intenta llamar a base.MemberwiseClone, no se interpretaría como una referencia sin sentido a la clase ficticia).
Wow esa es una forma compleja de hacerlo, ¿por qué no usar simplemente un constructor de copia? –
@Rowland no funcionará en tipos de referencia. editó mi respuesta de todos modos – Midhat
@Rowland - un constructor de copias probablemente no copie las cosas, y necesita mantenimiento a medida que se agregan los campos. La serialización binaria es una forma muy común de hacer copias en profundidad. –