2009-08-11 36 views
8

Java no permite la herencia de varias clases (aún permite la herencia de múltiples interfaces). Sé que está muy en línea con el problema clásico de los diamantes. Pero mis preguntas son: ¿por qué Java no permite herencia múltiple como C++ cuando no hay ambigüedad (y por lo tanto no hay posibilidades de que surja un problema con el diamante) mientras se hereda de una clase base múltiple?Herencia múltiple en java

+2

Si quiere mixins (= las partes buenas de MI) en un lenguaje jvm, eche un vistazo a scala. –

+0

En mi experiencia, la herencia múltiple puede generar un código muy frágil. Usar interfaces es mucho más saludable. Si desea reutilizar la lógica de implementación, use la delegación. Los IDE modernos como Eclipse facilitan la delegación de trabajo de una clase a otra. – JohnnySoftware

+0

Para cualquiera que busque un artículo detallado sobre 'Mixins', [aquí hay uno] (http://csis.pace.edu/~bergin/patterns/multipleinheritance.html). Como dice el artículo, solo se necesita 1 interfaz si las clases no necesitan servicios entre sí. Si ese es el caso, solo lea la segunda sección. – MattC

Respuesta

16

Era design decision de Java. Nunca lo conseguirás, así que no te preocupes demasiado por eso. Aunque MI puede ayudarte a crear Mixins, ese es el único bien que MI te hará alguna vez.

6

He leído que la mayoría de los programadores no usan herencia múltiple de forma adecuada. "Seguir adelante y heredar de una clase solo para reutilizar el código" no es la mejor práctica en caso de herencia múltiple.

Muchos programadores no saben cuándo usar la herencia simple en la mayoría de los casos. La herencia múltiple debe usarse con precaución y solo si usted sabe lo que está haciendo si quiere tener un buen diseño.

No creo que la falta de herencia múltiple en java (como en C++) imponga restricciones en el diseño del código/aplicación/mapeo de dominio problemático en las clases.

0

Una respuesta simple es que todas las clases en Java derivan de java.lang.Object IIRC. Por lo tanto, lo haría siempre tienen un problema de diamante ... surge :-D

+0

No realmente. Parent-> Child-> Object. Entonces Parent extiende Child, Child extends Object, simplemente no se escribe explícitamente en este último caso, ya que está implícito automáticamente. –

+0

@Massa: el problema de diamante se produce cuando hay múltiples implementaciones en clases base múltiples (de las cuales se deriva la clase hija) del mismo método. Si no estamos anulando los métodos definidos en la clase java.lang.Object, entonces esencialmente no conduce a la ambigüedad y al problema de los diamantes. –

+0

"Si no estamos anulando los métodos definidos en java.lang.Object" Anulo toString, hashcode e iguala mucho más seguido de lo que deseo herencia múltiple –

-1

El problema de diamantes cuando varias clases padre definir sus propias implementaciones de algo y la clase hija de estos dos tiene que lidiar con la ambigüedad de qué implementación usar. Entonces, ¿qué pasa si todas las clases en Java derivan de Object, esa es una clase para padres solteros. "Padre soltero, múltiples clases derivadas" no es lo mismo que "Padres múltiples, clase derivada simple"

+0

No. "problema de diamante" se refiere a múltiples clases base que comparten una clase base, no miembros con el mismo nombre. – curiousguy

2

Simplicidad. Para citar Tom Sintes,

El equipo de diseño de Java se esforzó para hacer Java:

  • simple, orientado a objetos, y familiar
  • robusta y segura
  • arquitectura neutra y portátil
  • alto rendimiento
  • Interpretado, enhebrado y dinámico

Las razones para omitir la herencia múltiple del lenguaje Java provienen principalmente del objetivo "simple, orientado a objetos y familiar". Como es un lenguaje sencillo, los creadores de Java querían un lenguaje que la mayoría de los desarrolladores de podían captar sin una capacitación exhaustiva. Para ello, trabajaron para hacer que el lenguaje fuera lo más similar posible a C++ (familiar) sin sobrecargar la complejidad innecesaria de C++ (simple).

En opinión de los diseñadores, la herencia múltiple causa más problemas y la confusión de lo que resuelve. Entonces cortaron herencia múltiple del lenguaje (del mismo modo que redujeron la sobrecarga del operador). La amplia experiencia en C++ de los diseñadores, , les enseñó que la herencia múltiple solo no valía la pena.

1

Los diseñadores de Java decidieron eso. La herencia múltiple se puede simular mediante el uso de interfaces.

2

si el soporte java herencia múltiple, entonces puede efectuar otras funciones de Java
considerar método super() que se utiliza para llamar a super programa constructor.if clase tiene múltiples superclase (debido a la herencia múltiple), entonces el compilador se confundirá sobre qué constructor de clase superior se debería llamar y arrojar un error

+0

corrígeme si estaba equivocado –

0

Es cierto que Java no solía admitir herencia múltiple de implementación (solo de tipo ie interfaz). Esa fue una decisión de diseño.

Sin embargo, desde Java 8, admite herencia múltiple utilizando métodos predeterminados. Ver http://docs.oracle.com/javase/tutorial/java/IandI/multipleinheritance.html:

La herencia múltiple de aplicación es la posibilidad de heredar definiciones de métodos de varias clases. Surgen problemas con este tipo de herencia múltiple , como conflictos de nombres y ambigüedad. ... Los métodos predeterminados introducen una forma de herencia múltiple de la implementación .

+0

El conflicto de nombre de la herencia de "interfaces" (clases degeneradas) también puede surgir. – curiousguy