Posible duplicado:
¿Por qué es super.super.method (); no permitido en Java?
Supongamos que tengo 3 clases A
, B
y C
, cada una extendiendo la anterior.
¿Cómo A.myMethod()
el código en A.myMethod()
de C.myMethod()
si B
también implementa myMethod
?
class A { public void myMethod() { // some stuff for A } } class B extends A { public void myMethod() { // some stuff for B //and than calling A stuff super.myMethod(); } } class C extends B { public void myMethod() { // some stuff for C // i don't need stuff from b, but i need call stuff from A // something like: super.super.myMethod(); ?? how to call A.myMethod(); ?? } }
No puedes. Esto es deliberado.
La clase B
proporciona una interfaz (como en el concepto, no la palabra clave de Java) a las subclases. Ha elegido no dar acceso directo a la funcionalidad de A.myMethod
. Si necesita que B
proporcione esa funcionalidad, entonces use un método diferente (nombre diferente, protected
). Sin embargo, es mejor “preferir la composición a la herencia”.
No puedes, y no deberías.
Esto es un signo de mal diseño. Cambie el nombre de un método o incluya la funcionalidad común requerida en otro método o clase de utilidad.
No estoy seguro de que puedas. Java hace que todos los métodos sean virtuales por defecto. Esto significa que la solución más simple no funcionará: declare una variable de tipo A
, asigne su instancia C
y llame a myMethod
para que se llame a myMethod
.
Podría intentar reflejar el tipo A
e invocar sus métodos directamente. Sería interesante ver qué sucede en este caso, pero me sorprendería si el envío virtual no sucediera …