2008-12-13 30 views

Respuesta

27

El problema común con la herencia múltiple es el "problema de los diamantes".

A 
/\ 
B c 
\/
    D 

Si un método virtual en A es implementado por tanto B como C, ¿cuál se obtiene cuando se crea D?

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

+2

No es un problema si necesita D para ambiguate. –

2

¿Cómo concilia si A implementa un método llamado Z y B implementa un método llamado Z y tiene:

hijo: 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, solo plantea un montón de puntos difíciles y proporciona poco valor

+0

Este problema se puede resolver fácilmente si el compilador requiere que anule el método z en la clase secundaria. Además, surge el mismo problema en los idiomas en los que se permite la herencia de interfaz múltiple si tiene 2 interfaces con un método con el mismo nombre pero con una firma diferente. – hariseldon78

3

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

13

Se percibe como malvado porque es simplemente más complejo y plantea 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 envoltorio complejo donde el contructor base debe construirse con objetos miembros no triviales, y como los objetos base deben construirse antes que los objetos miembros, el truco es usar MI (el " base del miembro "idiom."), de lo contrario debe usar una fábrica y más pasos para hacer la construcción como lo hace Java (Java no tiene MI para clases que no son de interfaz).

No tengas miedo y utilízalo cuando sea apropiado (aunque puede llevar algo de práctica detectar un buen ajuste).