2014-05-06 18 views
8

Diciamo che ho due classi Base e Derived:uso forza di un metodo della classe base in Java

public class Base { 
    public Base() { } 
    public void methodA() { 
     System.out.println("Base: methodA"); 
     methodB(); 
    } 
    public void methodB() { 
     System.out.println("Base: methodB"); 
    } 
} 
public class Derived extends Base { 
    public Derived() { } 
    public void methodA() { 
     super.methodA(); 
     System.out.println("Derived: methodA"); 
    } 
    public void methodB() { 
     System.out.println("Derived: methodB"); 
    } 
} 

Ora, con questo:

Base d = new Derived(); 
d.methodA(); 

stamperà:

Base: methodA 
Derived: methodB 
Derived: methodA 

La mia domanda è: È possibile forzare d.methodA() per usare Base.methodB()? Voglio il codice per stampare:

Base: methodA 
Base: methodB 
Derived: methodA 

Per coloro informato in C++, questo potrebbe essere fatto con qualcosa come Base::methodB() nella classe Base. Esiste un equivalente in Java?

Sono quasi sicuro che questo è stato chiesto prima, ma non sono riuscito a trovare nulla, mi dispiace se questo è un duplicato.

+0

No, un metodo sottoposto a override non può essere non sovrascritto in Java. La chiamata al metodo genitore chiamerà sempre il metodo sottoclasse. Potrebbe essere possibile farlo in byte code ma questo non sarebbe in Java. –

risposta

6

Se un metodo nella classe base può avere una sostituzione, e la classe derivata ha fornito uno, non c'è modo per forzare una chiamata al metodo della classe base.

Se la classe base deve chiamare la funzionalità nella classe base, può inserirla in un metodo separato e dichiararla final. Poi si potrebbe prendere una decisione tra la propria implementazione e l'attuazione derivato in questo modo:

public class Base { 
    public Base() { } 
    public void methodA() { 
     System.out.println("Base: methodA"); 
     // Call the derived method 
     methodB(); 
     // Call the base method 
     methodB_impl(); 
    } 
    public final void methodB_impl() { 
     System.out.println("Base: methodB"); 
    } 
    public void methodB() { 
     methodB_impl(); 
    } 
} 
0

Impossibile farlo. In C++ - speak, tutti i metodi Java sono "virtuali". Quindi, fare questo, invece:

public class Base { 

    public void methodA() { 
     System.out.println("Base: methodA"); 
     baseMethodB(); 
    } 

    public void methodB() { 
     baseMethodB(); 
    } 

    private void baseMethodB() { 
     System.out.println("Base: methodB"); 
    } 
} 
0

Penso che si può ottenere quello che vuoi dalla scoppiare la funzionalità nella classe padre in essa del proprio metodo in questo modo. Non è la direzione che stavi cercando ma ottiene quello che desideri:

public class Base { 
    public Base() { } 
    public void methodA() { 
     System.out.println("Base: methodA"); 
     methodBInner(); 
    } 

    public void methodB() { 
     methodBInner(); 
    } 

    private void methodBInner() { 
     System.out.println("Base: methodB");   
    } 
} 
Problemi correlati