La interfaz ICloneable
por sí mismo no es muy útil, lo que equivale a decir que en realidad no hay muchas situaciones en las que es útil saber que un objeto es cloneable sin saber nada más sobre el asunto. 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ó, 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 base -type y ICloneable
restricciones). Aunque la interfaz ICloneable
no indicaría la clonación profunda o superficial, la documentación para WonderfulBase
indicaría si clonable WonderfulBase
debe clonarse 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.
** Vea también **: [La controversia de ICloneable: ¿Debe una clase implementar ICloneable o no?] (Http://www.sysexpand.com/?path=howto/implement-icloneable-or-not) – KyleMit