2010-04-06 14 views
23

Eventuali duplicati:
Why is super.super.method(); not allowed in Java?Java Come chiamare il metodo dei nonni?

Supponiamo che io ho 3 classi A, B e C, ognuna si estende la precedente.

Come chiamare il codice in A.myMethod() da se B implementa anche 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(); ?? 
    } 
} 
+0

Perché dovresti farlo? Puoi fare un esempio? – Macarse

risposta

18

Non è possibile. Questo è intenzionale.

Classe B fornisce un'interfaccia (come nel concetto, non la parola chiave Java) alle sottoclassi. Ha scelto di non concedere l'accesso diretto alle funzionalità di A.myMethod. Se si richiede B per fornire tale funzionalità, quindi utilizzare un metodo diverso (nome diverso, renderlo protected). Tuttavia, è probabilmente meglio "preferire la composizione all'ereditarietà".

+0

Grazie ragazzi! cercherò di rielaborare il mio design. – Arkaha

+0

Arkaha, vedi la mia risposta alla tua domanda. È sintatticamente possibile chiamare un metodo definito da una superclasse che non sia il tuo antenato diretto (il tuo * super *). Ma è necessario avere una valida ragione per farlo. –

0

Non sono sicuro che sia possibile. Java rende tutti i metodi virtuali per impostazione predefinita. Ciò significa che la soluzione più semplice non funzionerà: dichiarare una variabile di tipo A, assegnare l'istanza C e chiamare myMethod in modo che venga chiamato il numero C.myMethod.

Si potrebbe provare a riflettere il tipo A e invocare direttamente i suoi metodi. Sarebbe interessante vedere cosa succede in questo caso, ma sarei sorpreso se la spedizione virtuale non accadesse ...

2

Non puoi, e non dovresti.

Questo è un segno di cattivo design. Rinominare un metodo o includere la funzionalità comune richiesta in un altro metodo o in una classe di utilità.

+1

Reflection * anche * non fornisce un modo per farlo, le normali regole del polimorfismo di runtime ** si applicano comunque **. Non si può nemmeno implementare 'super.myMethod()' usando reflection, per non parlare del teorico 'super.super.myMethod()'. –

+0

corretto. aggiornato. – Bozho

+0

Non necessariamente, è necessario farlo quando si definiscono le classi interne (ad esempio, la definizione dei listener di azioni in Swing o le classi di richiamata). Al di fuori di tali situazioni, sì, è design errato, ma * di per sé * non lo è. La sintassi Java lo supporta comunque (vedi la mia risposta alla domanda di Arkaha). –

Problemi correlati