ejemplo - clone object c#
¿Por qué debería implementar ICloneable en c#? (4)
¿Puede explicarme por qué debería heredar de ICloneable
e implementar el método Clone()
?
Si quiero hacer una copia profunda, ¿no puedo simplemente implementar mi método? Digamos MyClone()
?
¿Por qué debería heredar de ICloneable
? ¿Cuáles son las ventajas? ¿Es solo cuestión de hacer que el código sea "más legible"?
La interfaz ICloneable
en sí misma no es muy útil, lo que quiere decir que realmente no hay muchas situaciones en las que sea útil saber que un objeto es clonable sin saber nada más al respecto. Esta es una situación muy diferente de, por ejemplo, IEnumerable
o IDisposable
; hay muchas situaciones en las que es útil aceptar un IEnumerable
sin saber nada más que la forma de enumerarlo.
Por otro lado, ICloneable
puede ser útil cuando se aplica como una restricción genérica junto con otras restricciones. Por ejemplo, una clase base podría ser útil para varios derivados, algunos de los cuales podrían clonarse de forma útil y otros no. Si el tipo de base expuso una interfaz de clonación pública, cualquier tipo de derivado que no pudiera clonarse violaría el Principio de sustitución de Liskov. La forma de evitar este problema es hacer que el tipo de base soporte la clonación usando un método Protegido, y permitir que los tipos derivados implementen una interfaz de clonación pública como lo consideren apropiado.
Una vez que se logró esto, un método que quiere aceptar un objeto de un tipo WonderfulBase
y necesita poder clonarlo, podría codificarse para aceptar un objeto WonderfulBase que admita clonación (utilizando un parámetro de tipo genérico con tipo base e ICloneable
restricciones). Aunque la interfaz ICloneable
no indicaría en sí misma la clonación profunda o superficial, la documentación de WonderfulBase
indicaría si la WonderfulBase
clonable debe ser clonada profunda o superficialmente. Esencialmente, la interfaz ICloneable
no lograría nada que no se lograría definiendo ICloneableWonderfulBase
, excepto que evitaría tener que definir diferentes nombres para cada clase base clonable diferente.
Matt está en lo correcto, no lo uses. Cree su propio método Copy()
(o un nombre similar) y deje perfectamente claro en su API pública si su método está creando una copia profunda o superficial de su objeto.
No deberias. Microsoft recomienda no implementar ICloneable
porque la interfaz no indica claramente si su método Clone
realiza un Clone
"profundo" o "poco profundo".
Vea esta publicación del blog de Brad Abrams en 2003 (!) Para más información.
ICloneable
es uno de esos artefactos en el BCL que ha sido controvertido. No hay una razón real en mi humilde opinión para implementarlo. Dicho esto, si voy a crear un método de clonación, implemento ICloneable
y proporciono mi propia versión fuerte de Clone
.
El problema con ICloneable
es que nunca se indica si Clone
era una copia superficial o profunda, que son cosas muy diferentes. El hecho de que no haya ICloneable<T>
podría ser una indicación en los pensamientos de Microsoft sobre ICloneable