¿Por qué C # no admite herencia múltiple?

10

Incluso si pudieran ser malas prácticas, diría que hay tiempo para que cumpla su propósito.

Amir Rezaei
fuente
1
Me encanta cómo todos inventan todas estas excusas por la ausencia de una capacidad totalmente útil en lo que sea que Microsoft produzca (los MVP son especialmente expertos en esto). Supongo que la mayoría de las personas que no entienden los beneficios de la herencia múltiple son las que no entienden (y no usan) la herencia en primer lugar, porque prefieren la siempre popular copia y pego el código 20 veces que veo en casi todos los proyectos en todas partes. Sin duda, si Microsoft decide implementar MI, y de repente todos se convertirán en un entusiasta entusiasta, sin esperar un "evangelista", afirmando
1
@DaveZiffer probablemente, pero parece ser difícil hacerlo bien. ¿Conoces un lenguaje o implementación donde funcione realmente bien?
44
@Dave O simplemente sobreestimas su utilidad. La herencia en general está sobrevalorada, y los casos que faltan se pueden modelar fácilmente usando interfaces y composición. La herencia múltiple realmente es inútil en C #. La única ventaja que tiene es que evita la necesidad de delegar manualmente los métodos de interfaz a la implementación en los miembros compuestos. Esto podría haberse resuelto mejor (por ejemplo, introduciendo mixins), pero no es una buena razón para introducir la herencia múltiple.
Konrad Rudolph
He estado codificando OO en Java durante muchos años ahora haciendo un uso razonable de la herencia (muy a veces, menos cuando aprendí mejor) y he encontrado exactamente 1 vez cuando era realmente difícil sortear la herencia múltiple y tal vez 10 veces donde podría haberlo usado para simplificar mi diseño actual, y exactamente cero veces cuando no pude rediseñarlo para no necesitar herencia múltiple y tener el diseño general mejor de lo que hubiera sido con él.
Bill K

Respuestas:

14

/programming/995255/why-is-multiple-inheritance-not-allowed-in-java-or-c cubre muy bien esta pregunta.

Mi opinión sobre esto es esta: los diseñadores probablemente quisieron hacer un lenguaje que promoviera buenos principios de diseño. Ok, hay veces que la herencia múltiple es perfecta. Sin embargo, esas son la excepción, más que la regla, y pueden ser abusadas muy fácilmente. Entonces, los diseñadores decidieron hacer que sea imposible hacerlo.

Para aquellos casos en los que sería bueno, debe usar interfaces. Esos trabajos, aunque torpemente; pero no los necesitarás tanto para eso.

Michael K
fuente
8

Solo para ilustrar por qué no, C ++ admite la herencia múltiple, pero se desaconseja encarecidamente, ya que puede lograr la mayoría de las cosas con la composición que haría con MI, sin embargo, de una manera mucho más limpia. A diferencia de C ++, C # no es un lenguaje OOP de tipo "híbrido", es decir, no evolucionó de un lenguaje anterior.

Si realmente necesita herencia múltiple, puede implementar múltiples interfaces.

Jas
fuente
6

Walter Bright es el creador de D, que no incluye MI, y la única persona que ha escrito un compilador C ++ completo por sí mismo. Según él, la razón por la que D carece de MI es que es demasiado difícil crear un sistema de MI que sea a la vez eficiente, simple y útil. Sospecho que Java y C # usan un razonamiento similar. Los lenguajes como Perl y Python no tienen la eficiencia como objetivo principal, por lo que tienen un sistema que es simple y útil, pero difícil de implementar de manera eficiente. C ++ no parece tener la simplicidad como un objetivo, por lo que creó un sistema enormemente complicado que casi nadie comprende.

Creo que Walter está justo en el blanco. Si existe algún idioma que tenga un sistema de MI que satisfaga estos tres criterios razonablemente bien, deje un comentario.

dsimcha
fuente
2
¿Qué opinas de Eiffel, Common Lisp y Dylan? Sé que los tres son simples y útiles. Y sé que tanto Common Lisp como Dylan pueden competir e incluso vencer a C ++ (y a menudo incluso a C) en rendimiento, por lo que parece satisfacer la eficiencia. Yo no sé que el Eiffel compilador es terriblemente lento pero sé casi nada sobre el rendimiento del código compilado que produce.
Jörg W Mittag
-1

Debido a que los diseñadores de lenguaje aparentemente querían producir un mejor C ++, no un mejor lenguaje en general. (Se puede debatir el éxito que tuvieron).

La herencia múltiple de estilo C ++ tiene algunos problemas, por lo que las personas que derivan de C ++ generalmente la omiten (Java, C #, D). Otros idiomas, Eiffel y Common Lisp, por nombrar dos, lo hacen de manera diferente y no parecen tener los mismos problemas.

David Thornley
fuente