2010-09-26 15 views

risposta

15

In caso di superamento di un metodo genitore nel suo figlio, gli oggetti figlio sempre utilizzare la versione override. Ma; è possibile utilizzare la parola chiave super per chiamare il metodo genitore, all'interno del corpo del metodo figlio.

public class PolyTest{ 
    public static void main(String args[]){ 
     new Child().foo(); 
    } 

} 
class Parent{ 
    public void foo(){ 
     System.out.println("I'm the parent."); 
    } 
} 

class Child extends Parent{ 
    @Override 
    public void foo(){ 
     //super.foo(); 
     System.out.println("I'm the child."); 
    } 
} 

Ciò stampare:

Sono il bambino.

Rimuovere il commento dalla riga di commento e sarebbe stampare:

Sono il genitore.

Sono il bambino.

Si dovrebbe cercare il concetto di polimorfismo.

+0

grazie mille –

2

Utilizzare la parola chiave super all'interno del metodo sottoposto a override nella classe figlio per utilizzare il metodo della classe genitore. Tuttavia, puoi utilizzare solo la parola chiave all'interno del metodo sottoposto a override. L'esempio qui sotto aiuterà.

public class Parent { 
    public int add(int m, int n){ 
     return m+n; 
    } 
} 


public class Child extends Parent{ 
    public int add(int m,int n,int o){ 
     return super.add(super.add(m, n),0); 
    } 

} 


public class SimpleInheritanceTest { 
    public static void main(String[] a){ 
     Child child = new Child(); 
     child.add(10, 11); 
    } 
} 

Il metodo add nella classe figlio chiama super.add di riutilizzare la logica aggiunta.

1

Prima di tutto, è un cattivo design, se avete bisogno di qualcosa del genere, è una buona idea refactoring, ad es. rinominando il metodo. Java allows calling of overriden method using the "super" keyword, ma solo un livello nella gerarchia, non sono sicuro, forse Scala e altre lingue JVM lo supportano per qualsiasi livello.

+0

grazie anche penso che sia meglio ans ...... –

0

Dire che la gerarchia è C->B->A con A che è la classe base.

Penso che ci sia altro da sistemare che rinominare un metodo. Quello sarà lavoro ma è una correzione?

Un modo è di rifattorizzare tutte le funzionalità comuni a B e C in D, e lasciare B e C ereditare da D: (B,C)->D->A Ora il metodo in B che nascondeva l'implementazione di A da C è specifico di B e rimane lì. Ciò consente a C di invocare il metodo in A senza hokery.

Problemi correlati