2010-03-12 6 views
5

Tengo un objeto de una subclase que extiende su superclase. Hay un método anulado en la subclase que se puede llamar utilizando el objeto. ¿Es posible llamar a la función de la superclase usando el objeto de la subclase?Acceso a la función de superclase utilizando el objeto de subclase

package supercall; 

public class Main { 

    public static void main(String[] args) { 
     SomeClass obj = new SubClass(); 
     obj.go(); //is there anything like, obj.super.go()? 
    } 

} 

class SomeClass { 
    SomeClass() { 

    } 
    public void go() { 
     System.out.println("Someclass go"); 
    } 
} 

class SubClass extends SomeClass { 
    SubClass() { 

    } 
    @Override 
    public void go() { 
     System.out.println("Subclass go"); 
    } 
} 

Considere el código de arriba.

Aquí se imprime

Subclase ir

. En lugar tengo que imprimir

superclase ir

.

Respuesta

15

No, no es posible, y si cree que lo necesita, vuelva a pensar en su diseño. El objetivo de anular un método es reemplazar su funcionalidad. Si una clase diferente sabe mucho sobre el funcionamiento interno de esa clase, estás matando por completo la encapsulación.

2

En lugar de:

System.out.println("Subclass go"); 

Escribir

super.go(); 

(o, ya sabes, simplemente no ponen en práctica ese método ...).

+0

Sí. Pero a veces usaría el método de la subclase también. ¿No es posible llamar al método de la superclase de alguna otra manera? algo así como obj.super.go() ??? Por supuesto, esta es una construcción incorrecta. ¿Quise decir algo similar? – bdhar

+0

Ohh hombre ... acabo de escribir esa respuesta (no publicada) ... mierda! – RubyDubee

+1

@bdhar: Sí, puedes llamar a 'super'. Pero necesita hacer esa llamada desde * en * la clase. No puede hacerse externamente. –

0

¿Hay alguna manera de lograr esto? No, no hay.

En tiempo de ejecución, la JVM elegirá los métodos para llamar en función del tipo de instancia (es decir, del polimorfismo), no según el tipo con el que se declara.

Su instancia es una instancia de subclase, por lo que se llamará al método go() en la subclase.

0

Una forma sería hacer que la subclase invoque la implementación de superclases. Pero supongo que eso no es lo que quieres?

class SubClass extends SomeClass {  
SubClass() {}  
    @Override  
    public void go() {  
     super.go 
    } 
} 
+0

@Steve ... Llamar a la función de superclase usando super palabra clave es de hecho la forma correcta. Lo que quería saber es si hay alguna otra forma de invocar el método superclass go() usando "obj" como referencia. –

3

Aquí imprime Subclase go . En su lugar tengo que imprimir Superclass ir

Bien, entonces no anule el método @ subclase, se llamará implementación de superclase.

Si desea ejecutar la implementación súper, y tiene algún otro código @ subclase, llame a super.go(); y luego ejecuta otras declaraciones

Está bien, ya que está reutilizando el código ya escrito, no debe copiar y pegar el código de la superclase y ponerlo en subprogramas, ya que es la duplicación de código. Pero si su objetivo es cambiar el comportamiento por completo, entonces no llame a super

Cuestiones relacionadas