multiple inheritance java
¿Clase extendiendo más de una clase Java? (11)
Sé que una clase puede implementar más de una interfaz, pero ¿es posible extender más de una clase? Por ejemplo, quiero que mi clase extienda tanto TransformGroup
como una clase que creé. ¿Es esto posible en Java? Ambas declaraciones de class X extends TransformGroup extends Y
y class X extends TransformGroup, Y
recibe un error. Y si no es posible, ¿por qué? TransformGroup
extiende el Group
pero supongo que también extiende el Node
ya que hereda los campos del Node
y se puede pasar donde se requiere un objeto Node
. Además, como todas las clases en Java, extienden la clase Object
. Entonces, ¿por qué no sería posible ampliar con más de una clase?
Entonces, si eso es posible, ¿cuál es la forma correcta de hacerlo? Y si no, ¿por qué y cómo debo resolver el problema?
En Java no se permite la herencia múltiple. Se excluyó del lenguaje como decisión de diseño, principalmente para evitar dependencias circulares.
Escenario 1: Como aprendió, lo siguiente no es posible en Java:
public class Dog extends Animal, Canine{
}
Escenario 2: Sin embargo, lo siguiente es posible:
public class Canine extends Animal{
}
public class Dog extends Canine{
}
La diferencia en estos dos enfoques es que en el segundo enfoque hay una clase principal o una super
clase claramente definida, mientras que en el primer enfoque la clase superior es ambigua.
Considere si tanto el Animal
como el Canine
tenían una drink()
método drink()
. Bajo el primer escenario, ¿a qué método padre se llamaría si Dog.drink()
? En el segundo escenario, sabemos que llamar a Dog.drink()
llamaría al método de drink
clases Canine
siempre y cuando Dog
no lo haya anulado.
En Java, la herencia múltiple no está permitida para implementaciones (clases) solo para interfaces:
interface A extends B, C
Por ejemplo, MouseInputListener extiende MouseListener y MouseMotionListener
Y, por supuesto, una clase puede implementar varias interfaces:
class X implements A, F
Hola por favor, tenga en cuenta como el trabajo real.
Los niños no pueden tener dos madres.
Así que en java, la subclase no puede tener dos clases padre.
Java no permite extender múltiples clases.
Asumamos que la clase C está extendiendo las clases A y B. Luego, si suponemos que las clases A y B tienen un método con el mismo nombre (Ej .: method1 ()). Considere el código:
C obj1 = new C();
obj1.method1();
- aquí JVM no entenderá a qué método debe acceder. Porque tanto las clases A como las B tienen este método. Así que estamos poniendo a JVM en un dilema, por lo que esa es la razón por la que se elimina la herencia múltiple de Java. Y como dicho implementando múltiples clases resolveremos este problema.
Espero que esto haya ayudado.
Java no proporcionó herencia múltiple.
Cuando dices que A se extiende a B, entonces significa que A extiende a B y que B extiende a Objeto.
No significa que A se extiende B, Objeto.
class A extends Object
class B extends A
Java no puede admitir múltiples herencias. Pero u puede hacer esto de esta manera
class X
{
}
class Y extends X
{
}
class Z extends Y{
}
La herencia múltiple no es posible con la clase, se puede lograr con la ayuda de la interfaz pero no con la clase. Es por diseño del lenguaje java. Mira un comentario de James Gosling.
por James Gosling en febrero de 1995 da una idea de por qué la herencia múltiple no es compatible con Java.
JAVA omite muchas de las características de C ++ poco utilizadas, poco comprendidas y confusas que, según nuestra experiencia, son más dolorosas que beneficiosas. Esto consiste principalmente en la sobrecarga del operador (aunque tiene una sobrecarga de métodos), herencia múltiple y coerciones automáticas extensas.
La mayoría de las respuestas dadas parecen suponer que todas las clases de las que queremos heredar están definidas por nosotros.
Pero, ¿qué sucede si una de las clases no está definida por nosotros? Es decir, no podemos cambiar de qué hereda una de esas clases y, por lo tanto, no podemos utilizar la respuesta aceptada, ¿qué sucede entonces?
Bueno, la respuesta depende de si tenemos al menos una de las clases que hemos definido. es decir, existe una clase A
en la lista de clases de las que nos gustaría heredar, donde A
es creado por nosotros.
Además de la respuesta ya aceptada, propongo 3 casos más de este problema de herencia múltiple y posibles soluciones para cada uno.
Herencia tipo 1
Bien, digamos que quieres una clase C
para ampliar las clases, A
y B
, donde B
es una clase definida en otro lugar, pero A
es nuestra. Lo que podemos hacer con esto es convertir A
en una interfaz, entonces, la clase C
puede implementar A
mientras extiende B
class A {}
class B {} // Some external class
class C {}
Se convierte en
interface A {}
class AImpl implements A {}
class B {} // Some external class
class C extends B implements A
Herencia tipo 2
Ahora digamos que tiene más de dos clases para heredar, bueno, la misma idea sigue siendo válida: todas las clases, excepto una, tienen que ser definidas por nosotros. Así que digamos que queremos que la clase A
herede de las siguientes clases, B
, C
, ... X
donde X
es una clase que es externa a nosotros, es decir, se define en otro lugar. Aplicamos la misma idea de convertir todas las otras clases, pero la última en una interfaz, entonces podemos tener:
interface B {}
class BImpl implements B {}
interface C {}
class CImpl implements C {}
...
class X {}
class A extends X implements B, C, ...
Herencia tipo 3
Finalmente, también existe el caso en el que solo tienes un montón de clases para heredar, pero ninguna de ellas está definida por ti. Esto es un poco más complicado, pero es factible haciendo uso de la delegation . La delegación permite que una clase A
pretenda ser otra clase B
pero cualquier llamada en A
a algún método público definido en B
, en realidad delega que llama a un objeto de tipo B
y se devuelve el resultado. Esto hace que la clase A
lo que yo llamaría una Fat class
¿Cómo ayuda esto?
Pues es simple. Usted crea una interfaz que especifica los métodos públicos dentro de las clases externas que le gustaría usar, así como los métodos dentro de la nueva clase que está creando, entonces su nueva clase implementa esa interfaz. Eso puede haber sonado confuso, así que déjame explicarte mejor.
Inicialmente tenemos las siguientes clases externas B
, C
, D
, ..., X
, y queremos que nuestra nueva clase A
herede de todas esas clases.
class B {
public void foo() {}
}
class C {
public void bar() {}
}
class D {
public void fooFoo() {}
}
...
class X {
public String fooBar() {}
}
A continuación, creamos una interfaz A
que expone los métodos públicos que anteriormente estaban en la clase A, así como los métodos públicos de las clases anteriores.
interface A {
void doSomething(); // previously defined in A
String fooBar(); // from class X
void fooFoo(); // from class D
void bar(); // from class C
void foo(); // from class B
}
Finalmente, creamos una clase AImpl
que implementa la interfaz A
class AImpl implements A {
// It needs instances of the other classes, so those should be
// part of the constructor
public AImpl(B b, C c, D d, X x) {}
... // define the methods within the interface
}
¡Y ahí lo tienes! Esto es una especie de pseudo-herencia porque un objeto de tipo A
no es un descendiente estricto de ninguna de las clases externas con las que comenzamos, sino que expone una interfaz que define los mismos métodos que en esas clases.
Podría preguntar, ¿por qué no solo creamos una clase que define los métodos que nos gustaría usar, en lugar de definir una interfaz? es decir, ¿por qué no solo tenemos una clase A
que contiene los métodos públicos de las clases de las que nos gustaría heredar? Esto se hace para reducir el coupling . No queremos que las clases que usan A
tengan que depender demasiado de la clase A
(porque las clases tienden a cambiar mucho), sino más bien confiar en la promesa dada dentro de la interfaz A
No hay concepto de herencia múltiple en Java. Sólo se pueden implementar múltiples interfaces.
No, no es posible en java (Tal vez en java 8 esté disponible). Excepto el caso cuando te extiendes en un árbol. Por ejemplo:
class A
class B extends A
class C extends B
Herencia Múltiple http://bit.ly/1Z62XjI
Supongamos que B y C son primordiales para el método heredado y su propia implementación. Ahora D hereda tanto B & C usando herencia múltiple. D debería heredar el método anulado. La pregunta es: ¿qué método anulado se usará? ¿Será de B o C? Aquí tenemos una ambigüedad. Para excluir tal situación, la herencia múltiple no se usó en Java.