A ICloneable
interface por si só não é muito útil, o que quer dizer que realmente não existem muitas situações em que seja útil saber que um objeto pode ser clonado sem saber mais nada sobre ele. Esta é uma situação muito diferente de, por exemplo, IEnumerable
ou IDisposable
; há muitas situações em que é útil aceitar um IEnumerable
sem saber nada além de como enumerá-lo.
Por outro lado, ICloneable
pode ser útil quando aplicado como uma restrição genérica junto com outras restrições. Por exemplo, uma classe base pode suportar de forma útil uma série de derivados, alguns dos quais podem ser clonados de forma útil e outros não. Se o próprio tipo base expusesse uma interface de clonagem pública, então qualquer tipo derivado que não pudesse ser clonado violaria o Princípio de Substituição de Liskov. A maneira de evitar esse problema é fazer com que o tipo base suporte a clonagem usando um método Protected e permitir que os tipos derivados implementem uma interface de clonagem pública conforme acharem adequado.
Uma vez feito isso, um método que deseja aceitar um objeto de um WonderfulBase
tipo, e precisa ser capaz de cloná-lo, pode ser codificado para aceitar um objeto WonderfulBase que suporte a clonagem (usando um parâmetro de tipo genérico com tipo base e ICloneable
restrições) . Embora a própria ICloneable
interface não indique clonagem profunda ou superficial, a documentação para WonderfulBase
indicaria se clonável WonderfulBase
deve ser clonado profunda ou superficial. Essencialmente, a ICloneable
interface não realizaria nada que não seria realizado pela definição ICloneableWonderfulBase
, exceto que evitaria a necessidade de definir nomes diferentes para cada classe base clonável diferente.