traduccion multiple java oop inheritance

multiple - Cheat herencia individual en Java?



java superclass (13)

He oído que hay una forma de engañar a la herencia individual e implementar herencia múltiple en Java. ¿Alguien sabe cómo implementar esto (sin usar la interfaz)?

Solo por curiosidad ;-)


Creo que la razón fundamental por la que Java no admite la herencia múltiple es la misma que C #; todos los objetos se derivan en última instancia de Object y tiene varias rutas a la misma clase base que es ambigua para el compilador. Ambiguous == Bad, por lo que el compilador no lo permite.

En cambio, puede simular herencia múltiple a través de la delegación. Vea este artículo para un ejemplo.


Debe tener cuidado de distinguir la herencia de la interfaz (esencialmente la herencia de un contrato para proporcionar instalaciones particulares) de la herencia de implementación (herencia de los mecanismos de implementación).

Java proporciona herencia de interfaz mediante el mecanismo implements y puede tener herencia de interfaz múltiple.

La herencia de implementación es el mecanismo de extensiones y solo tiene una versión única de eso. ¿ Realmente necesitas herencia de implementación múltiple? Apuesto a que no, está lleno de consecuencias desagradables, a menos que seas un programador de Eiffel de todos modos.


El uso de la composición en lugar de la herencia tiende a ser la forma de evitarlo. En realidad, esto también ayuda mucho con la capacidad de prueba, por lo que es una buena práctica en general.

Si solo quieres que tu tipo se "comporte" como muchos otros tipos, puedes heredar de tantas interfaces como quieras; sin embargo, no se puede "pedir prestado" detalles de implementación a partir de estos.


Estuve pensando en esto un poco más y me di cuenta de que si bien los proxies dinámicos funcionarán (¿cómo funciona RMI?), Si realmente desea este tipo de funcionalidad, sería mejor que observe la programación orientada a aspectos (AOP) usando algo así como AspectJ (eclipse.org/aspectj).

De esta forma, puedes obtener varios aspectos diferentes en una clase, dándote herencia pseudo mixin, sin las jerarquías de herencia horriblemente frágiles.

Como todos han señalado, querer / necesitar herencia múltiple generalmente indica que no se está acercando al problema desde la perspectiva correcta. Recuerde el principio GoF de "¡prefiera la composición sobre la herencia" para empezar!



JAVA no es compatible con Herencia múltiple.

Puede lograr que implemente múltiples interfaces y algunos lo ven como una forma de solucionar el problema. Personalmente, aún no he usado herencias múltiples, por lo que no puedo entender su atractivo.

Normalmente, cuando alguien sugiere herencias múltiples dentro de c # o JAVA, se debe al hecho de que "podrían" en c ++. Soy fanático de "solo porque no puedes querer decir que deberías". Como c # y JAVA no lo admiten, ¿por qué intentarlo y obligarlo a hacer algo para lo que no fue diseñado? Esto no quiere decir que hay casos únicos en los que es una técnica válida para empoly, solo el código puede ser refactorizado para que no lo necesite.


Probablemente podría "simularlo" administrando explícitamente el conjunto de superclases y utilizando la reflexión para buscar todas las superclases para el método de destino. No me gustaría hacer esto en producción, pero podría ser un programa de juguete interesante. Probablemente puedas hacer muchas cosas raras aprovechando la reflexión, creando clases sobre la marcha e invocando el compilador programáticamente.


Puede engañarlo un poco (y enfatizo un poco) al usar instancias de java.lang.reflect.Proxy.

Esto realmente solo le permite agregar interfaces adicionales y delegar sus llamadas a otra instancia en tiempo de ejecución.

Como alguien que es mentor y tutora de nuevos desarrolladores, me horrorizaría que alguien me mostrara el código que lo hizo. La reflexión es una de esas herramientas que realmente necesita comprender y tener una buena comprensión de Java antes de saltar. Personalmente, solo lo he hecho una vez, y era para hacer que un código que no tenía control implementara algunas interfaces. estaba esperando otro código que no tenía control (era un truco rápido, así que no tuve que escribir y mantener demasiado código de pegamento).


Usa la interface s. Puede implementar tantos como desee. Por lo general, puede usar alguna variante en el Patrón compuesto (GoF) para poder reutilizar el código de implementación si eso es deseable.


Al usar Inner Classes, esto es lo que C ++ a veces prefiere también: Inner Class Idiom .


La herencia múltiple individual no es compatible con Java, sino que tiene interfaces para cumplir el mismo propósito. En caso de que sea inflexible en el uso de la herencia múltiple, debe hacerlo en C ++.


Claro que puedes, pero es complicado y realmente deberías considerar si esa es la forma en que quieres ir.
La idea es usar una herencia basada en el alcance junto con una basada en el tipo. Lo cual es un tipo de conversación para decir que, para fines internos, las clases internas "heredan" métodos y campos de la clase externa. Es un poco como mixins, donde la clase externa está mezclada con la clase interna, pero no tan segura, ya que puedes cambiar el estado de la clase externa y usar sus métodos.
Gilad Bracha (uno de los principales diseñadores de lengua java) escribió un documento sobre eso. Entonces, supongamos que desea compartir algunos métodos para uso interno entre algunas clases no relacionadas (por ejemplo, para manipulación de cadenas), puede crear sub clases de ellas como clases internas de una clase que tiene todos los métodos necesarios, y las sub clases podrían usar métodos tanto de sus súper clases como de la clase externa.

De todos modos, es complicado para clases complejas, y puede obtener la mayor parte de la funcionalidad usando importaciones estáticas (de java 5 en). Gran pregunta para entrevistas de trabajo y concursos de pub ;-)


Sí, puedes decir que es un truco y es muy interesante que no puedas heredar múltiples clases en una sola clase, pero es posible implementar múltiples interfaces en una clase como

public class parents implements first, second{ }

pero recuerda, debes anular los métodos declarados en las interfaces.