La ICloneable
interfaz por sí sola 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 sobre él. Esta es una situación muy diferente de eg IEnumerable
o IDisposable
; hay muchas situaciones en las que es útil aceptar un IEnumerable
sin saber nada más que cómo enumerarlo.
Por otra parte, ICloneable
puede ser útil cuando se aplica como una restricción genérica junto con otras restricciones. Por ejemplo, una clase base podría admitir de manera útil una serie de derivados, algunos de los cuales podrían clonarse de manera útil y otros no. Si el tipo de base expuso una interfaz de clonación pública, entonces cualquier tipo 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 base admita la clonación mediante un método protegido y permitir que los tipos derivados implementen una interfaz de clonación pública como mejor les parezca.
Una vez que se logró, un método que quiere aceptar un objeto de un WonderfulBase
tipo, y necesita poder clonarlo, podría codificarse para aceptar un objeto WonderfulBase que admita la clonación (usando un parámetro de tipo genérico con tipo base y ICloneable
restricciones) . Aunque la ICloneable
interfaz en sí misma no indicaría una clonación profunda o superficial, la documentación de WonderfulBase
indicaría si la clonación WonderfulBase
debe ser profunda o superficial. Esencialmente, la ICloneable
interfaz no lograría nada que no se lograría mediante la definición ICloneableWonderfulBase
, excepto que evitaría tener que definir nombres diferentes para cada clase base clonable diferente.