2010-03-12 16 views
5

Ho un oggetto di una sottoclasse che estende la sua superclasse. C'è un metodo sovrascritto in sottoclasse che può essere chiamato usando l'oggetto. È possibile chiamare la funzione della superclasse usando l'oggetto sottoclasse?Accesso alla funzione di super classe utilizzando l'oggetto sottoclasse

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"); 
    } 
} 

Prendere in considerazione il codice sopra.

Qui la stampa

sottoclasse andare

. Invece devo stampare

superclasse andare

.

risposta

15

No, non è possibile, e se pensi di averne bisogno, ripensa il tuo progetto. L'intero punto di scavalcare un metodo è quello di sostituire la sua funzionalità. Se una classe diversa sa molto del funzionamento interno di quella classe, stai completamente uccidendo l'incapsulamento.

2

Invece di:

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

Scrivi

super.go(); 

(O, sai, non implementano questo metodo ...).

+0

super. Ma a volte userei anche il metodo della sottoclasse. Non è possibile chiamare il metodo della superclasse in qualche modo? qualcosa come obj.super.go() ??? Certo, questo è un costrutto sbagliato. Intendevo qualcosa di simile ?? – bdhar

+0

Ohh uomo ... ho appena scritto quella risposta (non inviata) ... merda !!! – RubyDubee

+1

@bdhar: Sì, puoi semplicemente chiamare 'super'. Ma devi fare quella chiamata da * in * la classe. Non può essere fatto esternamente. –

0

C'è un modo per raggiungere questo obiettivo? No, non c'è.

In fase di esecuzione, la JVM sceglierà i metodi da chiamare in base al tipo di istanza (vale a dire il polimorfismo per te), non in base al tipo con cui è stato dichiarato.

L'istanza è un'istanza di sottoclasse, quindi verrà chiamato il metodo go() nella sottoclasse.

0

Un modo sarebbe quello di rendere la sottoclasse chiamata l'implementazione di super classi. Ma sto dando per scontato che non è quello che vuoi?

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

@Steve .. Chiamando la funzione superclasse usando super parola chiave è davvero il modo corretto. Quello che volevo sapere era se c'è un altro modo per invocare il metodo superclasse go() usando "obj" come riferimento ?? –

3

Qui stampa Sottoclasse go . Invece devo stampare Superclasse go

OK, allora non sovrascrivere go metodo @ sottoclasse, chiamerà implementazione superclasse.

Se si desidera eseguire la super implementazione e avere qualche altro codice aggiuntivo @ sottoclasse, si chiama super.go(); e quindi eseguire alcune altre dichiarazioni.

È ok, poiché si sta riutilizzando codice già scritto, non si deve copiare codice copia dalla superclasse e inserirlo in sottotitoli poiché è la duplicazione del codice. Ma se il tuo obiettivo è quello di cambiare completamente il comportamento, allora non chiamare il numero

Problemi correlati