Solo quería saber de qué sirve la interfaz IClonable en .NET?¿Cuál es el uso de la interfaz IClonable en .NET?
Respuesta
Bueno, no mucho en realidad. Obtuvo una mención especial en el Framework Design Guidelines como una interfaz para evitar.
No instale ICloneable. Existen dos formas generales de implementar ICloneable, ya sea como una copia profunda o no profunda. Copia profunda copia el objeto clonado y todos los objetos referenciados por el objeto, recursivamente hasta que todos los objetos en el gráfico sean copiados. Una copia no profunda (referida a como 'superficial' si solo se copian las referencias de nivel superior ) no puede hacer ninguna, o parte de una copia profunda. Dado que el contrato de interfaz no especifica el tipo de clonación realizada, las diferentes clases tienen implementaciones diferentes . Un consumidor no puede confiar en ICloneable para hacerles saber si un objeto está clonado a fondo o no .
Se ha debatido en el pasado sobre la obsolescencia. No estoy seguro de qué salió de eso, pero los diseñadores del marco han admitido que probablemente fue un error.
Si desea admitir la clonación, crearía e implementaría interfaces separadas IDeepCopy
y IShallowCopy
o similares.
Crear copia del objeto especificado.
Soporta la clonación, que crea un nuevo instancia de una clase con el mismo valor como una instancia existente.
EDIT: Scott Chamberlain absolutamente a la derecha. Esta interfaz no especifica tampoco esta copia debe ser profunda o superficial. Y esta es una de las cosas más confusas sobre esta interfaz.
En caso de que no sabe lo que es una copia profunda http://en.wikipedia.org/wiki/Object_copy#Deep_copy –
"Clon se puede implementar ya sea como una copia profunda o una copia superficial. En una copia profunda, todos los objetos están duplicados, mientras que, en una copia superficial, solo los objetos de nivel superior están duplicados y los niveles inferiores contienen referencias ". - Documentos de MSDN para ICloneable.Clone. Entonces, no asumas que es una copia profunda. – Powerlord
@R. Bemrose: sí, tienes razón. Ya he editado mi respuesta. –
De MSDN: "La interfaz ICloneable contiene un miembro, Clone, que está destinado a admitir la clonación más allá de la proporcionada por MemberwiseClone."
Es una interfaz que si se implementa indica que las instancias de la clase se clonan y no solo se copian superficialmente. Sin embargo, la implementación de la interfaz IClonable no dice nada si se copia poco o si se copia profundamente.
Hay una discusión interesante sobre cómo usar IClonable aquí: http://channel9.msdn.com/forums/TechOff/202972-IClonable-deep-vs-shallow-best-practise/.
Creo que he encontrado un buen uso para iCloneable: para facilitar la creación de jerarquías de clases que incluyen tanto tipos clonables como no clonables.
Si una clase tiene un método de clonación público, entonces es imposible derivar de ella una clase que no pueda ser clonada significativamente, sin violar el Principio de sustitución de Liskov. El problema es que para cualquier clase dada puede ser útil tener una versión que sea clonable y una versión que permita clases derivadas no clonables.iCloneable proporciona una forma de hacer esto.
Supongamos que uno quiere definir la jerarquía de clases Widget, SuperWidget y SuperDuperWidget, y SuperDuperNoncloneableWidget. Widget, SuperWidget y SuperDuperWidget pueden admitir la clonación a través de un método protegido. Uno puede derivar de las clases CloneableWidget, CloneableSuperWidget y CloneableSuperDuperWidget.
Si uno no usara iCloneable (o algo equivalente), sería muy difícil escribir una función que funcionaría en un ClonableWidget, pero también podría funcionar en un CloneableSuperWidget. Sin embargo, utilizando iCloneable, uno puede tener la función de aceptar un widget, y también requiere que sea iCloneable. Esto permitirá que uno trabaje bien dentro de la jerarquía deseada.
Tenga en cuenta que, a diferencia de otras interfaces, iCloneable no es significativo de forma aislada. Solo es útil como restricción de tipo cuando se aplica a una clase que puede o no respaldar públicamente la clonación; la semántica superficial/profunda será la de esa clase.
¿Qué tal si se define IShallowClone y IDeepClone de esta manera?
public interface IShallowClone<T> { T ShallowClone(); }
public interface IDeepClone<T> { T DeepClone(); }
public interface IA : IShallowClone<IA>, IDeepClone<IA> { double a { get; } IA ia { get; } }
public interface IB : IA, IShallowClone<IB>, IDeepClone<IB> { double b { get; } IB ib { get; } }
public class A : IA
{
public double a { get; private set; }
public IA ia { get; private set; }
public A(IA that) { this.a = that.a; this.ia = (ia as IDeepClone<IA>).DeepClone(); }
public IA DeepClone() { return new A(this); }
public IA ShallowClone() { return this.MemberwiseClone() as IA; }
}
public class B : A, IB
{ public double b { get; private set; }
public IB ib { get; private set; }
public B(IB that) : base(that) { this.b = that.b; this.ib = (ib as IDeepClone<IB>).DeepClone(); }
public new IB DeepClone() { return new B(this); }
public new IB ShallowClone() { return this.MemberwiseClone() as IB; }
}
- 1. ¿cuál es el uso real de la interfaz en java?
- 2. ¿Cuál es el uso de la interfaz clonable en java?
- 3. ¿Cuál es el uso de System.String.Copy en .NET?
- 4. ¿Cuál es el uso de ObservableCollection en .net?
- 5. ¿Cuál es el uso de la interfaz BindingResult en Spring MVC?
- 6. ¿Cuál es el uso de la sintaxis = =?
- 7. ¿Cuál es el uso del método ConvertBack en la interfaz IValueConverter?
- 8. ¿Cuál es el equivalente Java de la interfaz IEquatable <T> de .NET?
- 9. ¿Cuál es el propósito de la interfaz de marcador?
- 10. Por favor, dígame ¿cuál es el uso de la palabra clave "default" en C# .NET
- 11. ¿Cuál es el "costo" de la reflexión .NET?
- 12. Cuál es la interfaz mínima que tiene la propiedad Count en .Net
- 13. ¿Cuál es el uso del uso de init() en JavaScript?
- 14. ¿Cuál es la diferencia entre interfaz y @interface en java?
- 15. ¿cuál es el uso de la palabra inline en Delphi
- 16. ¿Cuál es el uso de la sobrecarga const en C++?
- 17. ¿Cuál es el directorio 'obj' en .NET?
- 18. ¿Cuál es el caso de uso para un fragmento sin interfaz de usuario?
- 19. ¿Cuál es el uso previsto de IllegalStateException?
- 20. ¿Cuál es el uso de autómatas finitos?
- 21. ¿Cuál es el uso de Deployment.Current.Dispatcher.BeginInvoke (() => {...})?
- 22. ¿Cuál es el uso de typedef?
- 23. ¿Cuál es el uso correcto de DataContext.Refresh()?
- 24. ¿cuál es el equivalente .NET de @Deprecated en java?
- 25. ¿cuál es el uso básico de alignment_storage?
- 26. ¿Cuál es el uso de @SuppressWarnings
- 27. ¿Cuál es el uso de singletonList?
- 28. ¿Cuál es el uso de window.external?
- 29. ¿Cuál es el uso de - [NSUserDefaults registerDefaults:]?
- 30. ¿Cuál es el uso de Log4j API?
+1, respuesta correcta. –