Pregunta

Puede usted explicarme por qué debería heredar de ICloneable y poner en práctica el método Clone()?

Si quiero hacer una copia profunda, no puedo simplemente aplicar mi método? Digamos MyClone()?

¿Por qué debería heredar de ICloneable? ¿Cuáles son las ventajas? ¿Es sólo una cuestión de hacer el código "más legible"?

¿Fue útil?

Solución

No debería. Microsoft no recomienda implementar ICloneable porque no hay ninguna indicación clara de la interfaz si su método Clone realiza un clon o "profunda" "superficial".

esta entrada del blog de Brad Abrams vuelta en 2003 (!) para obtener más información.

Otros consejos

La interfaz ICloneable por sí 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 para aceptar una IEnumerable sin saber que no sea la forma de enumerar que nada.

Por otro lado, ICloneable puede ser útil cuando se aplica como una restricción genérico junto con otras limitaciones. Por ejemplo, una clase base podría ayudar útilmente a una serie de derivados, algunos de los cuales podrían ser clonados de forma útil, y algunos de los cuales no podía. Si el mismo tipo de base expone una interfaz de clonación pública, entonces cualquier tipo de derivado que no pudo ser clonado violaría el principio de sustitución de liskov. La forma de evitar este problema es tener el soporte de tipo base de clonación usando un método protegido, y permitir que los tipos derivados para implementar una interfaz de clonación pública como les parezca.

Una vez que se llevó a cabo, un método que quiere aceptar un objeto de un tipo WonderfulBase, y tiene que ser capaz de clonar él, podría ser codificado para aceptar un objeto WonderfulBase que soporta la clonación (utilizando un parámetro de tipo genérico con base- tipo y limitaciones ICloneable). Aunque la interfaz ICloneable no sería en sí indicar clonación profunda o superficial, la documentación para WonderfulBase indicaría si WonderfulBase cloneable debe ser profundas o poco profundas clonado. Esencialmente, la interfaz ICloneable no sería lograr cualquier cosa que no se lleva a cabo mediante la definición de ICloneableWonderfulBase, excepto que evitaría tener que definir diferentes nombres para cada clase base cloneable diferente.

ICloneable es uno de esos artefactos en el BCL que ha sido motivo de controversia. No hay ninguna razón real para ponerlo en práctica en mi humilde opinión. Dicho esto, si voy a crear un método clone entonces lo hago aplicar ICloneable, y proporciono mi propia versión mecanografiada fuerte de Clone.

El problema con ICloneable está nunca indicada si Clone era un poco profunda o una copia profunda, que son cosas muy diferentes. El hecho de que no hay ICloneable<T> podría ser una indicación en los pensamientos de Microsoft acerca de ICloneable

Matt es correcto, no lo use. Crear su propio método Copy() (o nombre similar) y que sea perfectamente claro en su API pública si su método es la creación de una copia profunda o superficial de su objeto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top