Pergunta

Pode explicar-me por que eu deveria herdar de ICloneable e implementar o método Clone()?

Se eu quiser fazer uma cópia profunda, eu não posso simplesmente implementar meu método? Vamos MyClone() digamos?

Por que eu deveria herdar de ICloneable? Quais são as vantagens? É apenas uma questão de fazer o código "mais legível"?

Foi útil?

Solução

Você não deveria. Microsoft recomenda a implementação ICloneable porque não há nenhuma indicação clara da interface se seus executa método Clone um "profundo" ou clone "superficial".

neste blog post de Brad Abrams volta em 2003 (!) para mais informações.

Outras dicas

A interface ICloneable por si só não é muito útil, que é dizer que não há realmente muitas situações onde é útil saber que um objeto é cloneable sem saber mais nada sobre isso. Esta é uma situação muito diferente, por exemplo, IEnumerable ou IDisposable; há muitas situações em que é útil para aceitar uma IEnumerable sem saber qualquer coisa diferente de como enumerar-lo.

Por outro lado, ICloneable pode ser útil quando aplicada como uma restrição genérica, juntamente com outras restrições. Por exemplo, uma classe de base poderia ser útil suportar um certo número de derivados, alguns dos quais podem ser utilmente clonados, e algumas das quais não pôde. Se o próprio tipo de base exposta uma interface de clonagem público, em seguida, qualquer tipo de derivado, que não podia ser clonado violaria a substituição de Liskov. A maneira de evitar este problema é ter o apoio tipo base clonagem utilizando um método protegido, e permitir tipos derivados para implementar uma interface clonagem pública como entenderem.

Uma vez que foi conseguido, um método que quer aceitar um objecto de um tipo WonderfulBase, e tem de ser capaz de clonar isso, poderia ser codificado para aceitar um objecto WonderfulBase que suportes de clonagem (usando um parâmetro de tipo genérico com base- tipo e restrições ICloneable). Embora a interface ICloneable não seria em si indicam profunda ou clonagem superficial, a documentação para WonderfulBase iria indicar se WonderfulBase cloneable deve ser profundas ou clonado-rasa. Essencialmente, a interface ICloneable não iria realizar qualquer coisa que não seria realizado através da definição ICloneableWonderfulBase, exceto que ele evitaria ter que definir nomes diferentes para cada classe base cloneable diferente.

ICloneable é um desses artefatos no BCL que tem sido controverso. Não há IMHO verdadeira razão para implementá-lo. Com isso dito, se eu estou indo para criar um método clone então eu faço implementar ICloneable, e eu oferecer minha própria versão datilografada forte de Clone.

O problema com ICloneable é que nunca indicou se Clone foi uma rasa ou uma cópia profunda que são coisas muito diferentes. O fato de que não há ICloneable<T> pode ser uma indicação sobre os pensamentos da Microsoft sobre ICloneable

Matt está correto, não usá-lo. Crie o seu próprio método Copy() (ou nome similar) e torná-lo perfeitamente claro em sua API pública se o seu método é a criação de uma cópia profunda ou superficial de seu objeto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top