Vi algunos comentarios en los foros, y parece que la gente quiere poder heredar de varias clases en C#. ¿Por qué necesitarías esto alguna vez? No se me ocurre ningún uso para esto, pero como hay gente que lo quiere, debe haber alguno.¿Qué uso heredar de varias clases?
Respuesta
Bueno, aquí es un ejemplo de ASP.NET Web Forms:
tengo una clase base, un control de la tela, digamos que es un simple TextBox
.
Luego heredo de TextBox
para dar formato - RichTextBox
.
Entonces quiero tener un TextBox
que puede deletrear-verificar - SpellCheckingTextBox
.
¿Qué sucede si necesito un SpellCheckingRichTextBox
? Tendría que implementar de nuevo la corrección ortográfica o la lógica de texto enriquecido y heredar de una u otra.
En realidad las definirías como interfaces: ISpellCheckingTextBox
y IRichTextBox
y las implementarías en un SpellCheckingRichTextBox
. También puede escribir métodos de extensión para TextBox
para lograr lo mismo.
La herencia múltiple es fundamentalmente defectuosa porque considera que las clases heredadas son iguales. ¿Qué ocurre si ambas clases base tienen un campo ID
?
Las personas probablemente quieran hacer esto porque están acostumbradas a hacerlo en C++. No está permitido en C#. Lo cual, IMO, es algo bueno, desde el punto de vista de la mantenibilidad de una aplicación. Muchas veces, el uso de múltiples interfaces logrará lo mismo.n
Si tiene una clase base con métodos abstractos diseñados adecuadamente y se sabe que el objeto heredado solo necesitará los métodos definidos en esa clase, usted tiene un válido patrón de diseño que no requiere MI.
Muy pocas personas realmente usan MI en C++. Realmente, las personas quieren usar MI porque no saben cómo hacerlo de la manera correcta. –
La herencia múltiple a veces se usaba en C++ (y en otros idiomas) para permitir que una clase heredara propiedades y código de múltiples clases base. Cuando tiene interfaces, como en C# y Java, realmente no hay necesidad de herencia múltiple, por lo que no se implementó en esos idiomas.
He aquí un buen artículo sobre la herencia múltiple en Eiffel:
http://archive.eiffel.com/doc/manuals/technology/bmarticles/joop/multiple.html
"No hay necesidad" es exagerado: sí, las interfaces hacen la mayor parte de lo que proporciona MI, pero mixins proporciona un poderoso modismo para combinar políticas de comportamiento ortogonales.Si ese poder vale los problemas del "diamante de la muerte" es otro problema por completo. –
Un caso legítimo para quererlo en C# es hacer un objeto derivado MarshalByRef. Por ejemplo, digamos que quiero hacer lo siguiente:
public class FooCorpClass
{
// This class is defined in a 3rd party library and thus can't be changed
}
public class MyFoo : FooCorpClass, MarshalByRef
{
// I can't do this because MarshalByRef isnt' an interface
}
Personalmente lo veo como una pena que no se puede tener la herencia múltiple si no hay colisiones, o tener un mecanismo de manejo de colisión, sino que los de la se rompe
- 1. ¿No se puede heredar de varias clases que definen __slots__?
- 2. ¿Cómo heredar de varias clases base en Java?
- 3. ¿De cuántas clases puedes heredar en C#?
- 4. Validaciones fluidas. Heredar clases de validación
- 5. ¿Es correcto heredar de las clases incorporadas?
- 6. Clases con colecciones como propiedades vs. clases Heredar colecciones
- 7. extraer varias clases (jQuery)
- 8. Uso de clases parciales
- 9. Intentando heredar tres clases base y no puedo
- 10. uso correcto de las clases?
- 11. por qué heredar del tipo de objeto
- 12. Compilación de varias clases (consola) en Java
- 13. Alternar varias clases de elementos con jQuery
- 14. ¿Son varias las clases de DataContext apropiadas?
- 15. Uso de Jaxb2Marshaller con varias clases con el mismo nombre de @XmlRootElement
- 16. Heredar clase UIViewController y XIB
- 17. Uso de varias instancias de MemoryCache
- 18. Java: constructor de Heredar
- 19. ¿Cómo comparar la herencia con varias clases?
- 20. Agregue el mismo método a varias clases
- 21. agregar y eliminar varias clases en jquery
- 22. CoffeeScript y NodeJS: ¿Cómo exporto varias clases?
- 23. Varias clases en un archivo .cpp
- 24. Rieles: uso de clases personalizadas en Rails
- 25. Reglas para heredar clase
- 26. ¿Cómo heredar de MonkeyDevice?
- 27. ¿Cómo heredar de NSDictionary?
- 28. Uso de clases genéricas con ObjectDataSource
- 29. Varias superclases en Objective-C?
- 30. Uso de clases de Java en Grails
La mayoría de las veces si necesita herencia múltiple, entonces su diseño es tal vez algo incorrecto :) –
En los días C++, a veces lo necesitaba, debido a la falta de interfaces –
Véase [¿Un uso para herencia múltiple?] (http://stackoverflow.com/questions/573913/a-use-for-multiple-inheritance) –