ventajas tipos que problema poo multiple herencia ejemplos diamante desventajas consiste con oop multiple-inheritance

oop - tipos - ¿Es la herencia múltiple malvada?



tipos de herencia multiple en java (4)

Posible duplicado:
¿Cuál es el problema exacto con la herencia múltiple?

¿Por qué se considera que la herencia múltiple es mala al implementar múltiples interfaces? ¿Especialmente cuando una vez considera que las interfaces son simplemente clases abstractas puras?

(Más o menos) duplicado de ¿Cuál es el problema exacto con la herencia múltiple? , Herencia Múltiple en C # y algunos otros ...


¿Cómo concilias si A implementa un método llamado z y b implementa un método llamado z y tienes:

niño: a, b

ahora si mi código de cliente llama a new child (). z (). ¿Qué implementación se está llamando? No creo que sea tan malo como eso, solo plantea una gran cantidad de puntos difíciles y proporciona poco valor


El problema común con la herencia múltiple es el "problema del diamante".

A / / B c / / D

Si B y C implementan un método virtual en A, ¿cuál obtienes cuando creas D?

La razón por la que esto no es un problema con las interfaces se debe a que las interfaces no tienen implementaciones, por lo que si A / B / C son todas las interfaces, D elige cómo implementar los métodos A de la manera que sea apropiada.


MI no es tanto mal como una solución altamente compleja para un problema raro. En la mayoría de los casos, hay una mejor manera de hacer lo mismo.


Se percibe como malvado porque es más complejo y genera más problemas de los que la gente suele esperar, especialmente cuando las clases base no son puramente abstractas (no hay miembros de datos). La herencia de diamantes se puede resolver usando herencia virtual, donde se comparte una base común. Y los compiladores pueden detectar colisiones de firmas de métodos. Si se usa bien, puede producir soluciones elegantes y SECAS que de otra forma serían más detalladas para implementar a través de la interfaz y las composiciones / delegaciones.

Una expresión común de MI en C ++ es para constructores de envoltura complejos donde el contructor base debe construirse con objetos miembros no triviales, y dado que los objetos base deben construirse antes que los objetos miembros, el truco es usar MI (la "base del miembro" idioma.), de lo contrario, tiene que usar una fábrica y más pasos para hacer la construcción como lo hace Java (Java no tiene MI para las clases que no son de interfaz).

No tengas miedo y úsala cuando sea apropiado (aunque puede llevar algo de práctica detectar un buen calce).