2010-04-23 16 views
9

Se ho una classe base Base thing = null; di cui v'è una sottoclasse class Subclass extends Base ed io istigare come thing = new Subclass Come potrei chiamare un metodo che è specificamente in sottoclasse, ma non in Base? ex. Base Basta method() Subclass ha method() e specialMethod() il metodo specialMethod() è quello che voglio chiamare.Chiamare un metodo di sottoclasse in Java

+2

In genere è una cattiva idea. Se sai che l'oggetto è di tipo Sottoclasse, allora fai riferimento ad esso e non hai problemi. Se il metodo appartiene davvero a Base - mettilo in Base. –

risposta

12

Se si sa che thing contiene un Subclass, si può fare:

((Subclass) thing).specialMethod() 
+6

Nota che se la cosa non è una sottoclasse, questo bombarderà con un 'ClassCastException' ... usa' instanceof' per verificare se 'thing' è una sottoclasse' prima se non sei sicuro. – Powerlord

1

Si deve scrivere, o lanciare cosa alla sottoclasse. Quindi:

 Subclass thing = new Subclass(); 

o:

 ((Subclass) thing).specialMethod(); 
7

Devi cast per essere in grado di richiamare il metodo:

Base thing = new SubClass(); 

((SubClass) thing).specialMethod(); 

Se dovete affrontare questa situazione, molto probabilmente non lo fai avere l'interfaccia giusta (il giusto insieme di metodi)

Prima di andare in profondità nella fase in cui si inizia a convalidare tutto per sapere se è possibile richiamare un metodo o non come in:

public void x (Base thing) { 
    if(thing.instanceof Subclass) { 
     ((SubClass)thing).specialMethod(); 
    } 
} 

prendere in considerazione se non è necessario spostare il specialMethod alto nella gerarchia in modo che appartiene alla base.

Se sicuramente non ne ha bisogno nella base, ma è necessario che nella sottoclasse almeno prendere in considerazione di utilizzare il tipo corretto:

SubClass thing = ... 
// no need to cast 
thing.specialMethod(); 

Ma, come sempre, questo dipende da quello che stai cercando di fare.

+0

L'istruzione 'if' dovrebbe probabilmente avere un' else' ... –

3

quando si tratta di eredità/polimorfismo in Java ci sono fondamentalmente due tipi di calchi che si vede:

upcasting:

Superclass x = new Subclass(); 

Ciò è implicito e non ha bisogno di un cast difficile perché Java sa che tutto ciò che può fare il Superclass, lo Subclass può fare pure.

downcasting

Superclass x = new Subclass(); 

Subclass y = (Subclass) x; 

In questo caso è necessario fare un cast difficile perché Java non è del tutto sicuro se questo funzionerà o meno. Devi confortarlo dicendo che sai cosa stai facendo. La ragione di ciò è perché la sottoclasse potrebbe avere alcuni metodi strani che la superclasse non ha.

In generale, se si desidera creare un'istanza di una classe per chiamare qualcosa nella relativa sottoclasse, è consigliabile creare un'istanza della sottoclasse per iniziare o determinare se il metodo deve essere incluso nella superclasse.

16

Gli altri hanno già menzionato come eseguire il cast degli oggetti per ottenere una risposta alla tua domanda, ma ponendo la domanda in primo luogo punti a un possibile problema di progettazione. Alcuni possibili motivi:

+1

basta cambiarlo in "possibile problema di progettazione" e sono completamente d'accordo. – David

0

Un altro approccio potrebbe essere quello di effettuare le seguenti operazioni:

public abstract class Base { 

    //method() not implemented 

    public abstract void specialMethod(); 
} 

public class Subclass extends Base { 

    //method() not implemented 

    @Override 
    public void specialMethod() { 
     //put your code here 
     System.out.println("specialMethod from Subclass"); 
    } 
} 

modo da poter fare:

thing.specialMethod(); 

e vi darà: "specialMethod da Sottoclasse".

Problemi correlati