2010-06-01 14 views
5

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?

+2

La mayoría de las veces si necesita herencia múltiple, entonces su diseño es tal vez algo incorrecto :) –

+0

En los días C++, a veces lo necesitaba, debido a la falta de interfaces –

+2

Véase [¿Un uso para herencia múltiple?] (http://stackoverflow.com/questions/573913/a-use-for-multiple-inheritance) –

Respuesta

3

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?

1

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.

+0

Muy pocas personas realmente usan MI en C++. Realmente, las personas quieren usar MI porque no saben cómo hacerlo de la manera correcta. –

1

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

+0

"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. –

0

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