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
risposta
Se si sa che thing
contiene un Subclass
, si può fare:
((Subclass) thing).specialMethod()
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
Si deve scrivere, o lanciare cosa alla sottoclasse. Quindi:
Subclass thing = new Subclass();
o:
((Subclass) thing).specialMethod();
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.
L'istruzione 'if' dovrebbe probabilmente avere un' else' ... –
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.
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:
- Il metodo è nel posto sbagliato.
- Il codice che chiama il metodo è nel posto sbagliato.
- La sottoclasse non dovrebbe estendere l'altra classe. È meglio per prefer composition over inheritance. E quando si eredita, il codice dovrebbe seguire lo Liskov substitution principle.
- Le classi sono non-cohesive, hanno più di one responsibility e devono essere divise in più classi.
basta cambiarlo in "possibile problema di progettazione" e sono completamente d'accordo. – David
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".
- 1. Chiamare un metodo di sottoclasse dalla superclasse
- 2. Chiamare la superclasse da un costruttore sottoclasse in Java
- 3. Java: Chiamare un metodo eccellente, che chiama un metodo override
- 4. Chiamare un metodo java in jsp
- 5. accesso negato durante la chiamata metodo java sottoclasse metodo
- 6. Chiamare il costruttore della sottoclasse dalla classe astratta in Java
- 7. java chiamare un metodo da un'altra classe
- 8. Java polimorfismo Come chiamare al metodo di classe eccellente per oggetto sottoclasse
- 9. Come chiamare un metodo su un tempo specifico in java?
- 10. Il sovraccarico di un metodo in una sottoclasse in C++
- 11. Chiamare il metodo della sottoclasse dalla sua superclasse
- 12. Come chiamare un metodo con una discussione separata in Java?
- 13. Chiamare il metodo C# all'interno di un programma Java
- 14. Come chiamare un metodo privato dall'esterno di una classe java
- 15. Chiamare un metodo NSTimer
- 16. Come chiamare il metodo principale di un programma Scala dal metodo principale di un programma java?
- 17. Chiamare il metodo API Win32 da Java
- 18. Chiamare un'API Java da .NET - metodo migliore
- 19. Un metodo nativo può chiamare un metodo privato?
- 20. Java Come chiamare il metodo dei nonni?
- 21. Chiamare un java metodo generico sovraccaricato da Scala
- 22. Chiamare il metodo di adattamento più vicino
- 23. Dimensione massima di un metodo in java?
- 24. Perché non si può ridurre la visibilità di un metodo in una sottoclasse Java?
- 25. Come chiamare un metodo python da una classe java?
- 26. Chiamare un metodo Java da Visual Basic 6
- 27. Chiamare un metodo come un metodo di estensione richiede più di riferimento che chiamare direttamente
- 28. 10 Chiamare i metodi di sottoclasse dalla superclasse in un vettore C++
- 29. Chiamare il metodo varargs Java con un argomento null singolo?
- 30. Chiamare un metodo in una classe in ogni altro metodo
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. –