Jeśli mam klasę bazową z których Base thing = null;
tam jest podklasą class Subclass extends Base
i prowokować go jako thing = new Subclass
jak nazwałbym metodę, która jest specjalnie w podklasie, ale nie w bazie? np. Base
ma tylko method()
Subclass
został method()
i specialMethod()
metoda specialMethod()
jest jeden chcę zadzwonić.Wywołanie metody podklasy w Javie
Odpowiedz
Jeśli wiesz, że thing
zawiera Subclass
można zrobić:
((Subclass) thing).specialMethod()
Zauważ, że jeśli coś nie jest "podklasą", będzie bombardować 'ClassCastException' ... użyj' instanceof', aby sprawdzić, czy 'rzecz' jest' Subklasą ', jeśli nie jesteś pewien. – Powerlord
należy wpisać lub oddania rzeczy do podklasy. Więc:
Subclass thing = new Subclass();
czyli
((Subclass) thing).specialMethod();
Trzeba cast
to, aby móc wywołać metodę:
Base thing = new SubClass();
((SubClass) thing).specialMethod();
jeśli obliczu tej sytuacji, najprawdopodobniej nie robić mieć odpowiedni interfejs (odpowiedni zestaw metod)
Zanim przejdziesz w głąb sceny rozpoczęciem sprawdzania wszystko, aby wiedzieć, czy można wywołać metodę lub nie podoba w:
public void x (Base thing) {
if(thing.instanceof Subclass) {
((SubClass)thing).specialMethod();
}
}
rozważenia, jeśli nie trzeba przesunąć specialMethod
w hierarchii tak należy do podstawy.
Jeśli zdecydowanie nie trzeba go w bazie, ale trzeba go w podklasie przynajmniej rozważyć używać odpowiedniego typu:
SubClass thing = ...
// no need to cast
thing.specialMethod();
Ale jak zawsze, to zależy od tego, co starasz się zrobić.
To stwierdzenie "jeśli" powinno prawdopodobnie mieć "inny" ... –
Gdy mamy do czynienia ze spadków/polimorfizmu w Javie istnieją zasadniczo dwa rodzaje odlewów, które można zobaczyć:
Upcasting:
Superclass x = new Subclass();
To jest niejawny i nie wymaga twardego obsady, ponieważ Java wie, że wszystko, co może zrobić Superclass
, może również zrobić.
rzutowanie w dół
Superclass x = new Subclass();
Subclass y = (Subclass) x;
W tym przypadku trzeba zrobić twardy obsady, ponieważ Java nie jest pewien, czy to będzie działać czy nie. Musisz go pocieszyć, mówiąc, że wiesz, co robisz. Powodem tego jest to, że podklasa może mieć kilka dziwnych metod, których nie ma nadklasa.
Ogólnie rzecz biorąc, jeśli chcesz utworzyć instancję klasy w celu wywołania czegoś w jej podklasie, powinieneś po prostu utworzyć instancję podklas na samym początku - lub określić, czy metoda powinna znajdować się również w klasie nadrzędnej.
Inni już wspomnieli, jak rzutować obiekty, aby uzyskać odpowiedź na swoje pytanie, ale zadając to pytanie na pierwszym miejscu, wskazuje na możliwy problem projektowy. Możliwe przyczyny:
- Metoda jest w niewłaściwym miejscu.
- Kod, który wywołuje metodę, znajduje się w niewłaściwym miejscu.
- Podklasa nie powinna przedłużać drugiej klasy. Najlepiej jest prefer composition over inheritance. A gdy dziedziczy, kod powinien być zgodny z Liskov substitution principle.
- Klasy są non-cohesive, mają więcej niż one responsibility i powinny być podzielone na wiele klas.
po prostu zmienić go na "możliwy problem projektowy" i całkowicie się zgadzam. – David
Innym rozwiązaniem może być wykonanie następujących czynności:
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");
}
}
Więc można zrobić:
thing.specialMethod();
i to daje: "specialMethod z Podklasa".
- 1. Niejednoznaczne wywołanie metody z Lambda w Javie
- 2. Czy odlewanie w Javie ukrywa metody i pola podklasy?
- 3. wywołanie innej metody z głównej metody w Javie
- 4. Wywołanie warunków wyścigu w Javie
- 5. wywołanie metody w Xcode
- 6. Metody macierzyste w Javie
- 7. metody nadklasy wrócić typu podklasy w Swift
- 8. Wywołanie metody asynchronicznej w IEnumerable.Select
- 9. Wywołanie metody klasy w after_save
- 10. Warunkowe wywołanie metody w Scala
- 11. Wywołanie metody C# w ramach programu Java
- 12. Wywołanie super.init() w inicjatorze podklasy NSObject w Swift
- 13. Metody z parametrami w Javie
- 14. Wywołanie metody Force base
- 15. rozrządu na wywołanie metody
- 16. Wywołanie metody NSTimer
- 17. Wyśmiewać wywołanie metody ogólnie
- 18. Wywołanie metody instancji statycznie
- 19. Odłóż podklasy od przesłonięcia metody Java
- 20. Jak uczynić wszystkie odziedziczone metody obiektami podklasy?
- 21. Emulowanie metody list.insert() jako podklasy listy Pythona
- 22. Wywołanie konstruktora nadrzędnego podczas inicjowania podklasy w Swift
- 23. Wywołanie metody asynchronicznej z metody non-asynchronicznym
- 24. Wywołanie metody z nadklasy Podklasa - JavaScript
- 25. Wywołanie nadpisanej metody z superklasy w pismach maszynowych
- 26. PHP: wywołanie konstruktora podrzędnego z metody statycznej w obiekcie macierzystym
- 27. varargs typu klasy w Javie
- 28. Dziedziczenie rdzy: wywołanie metody macierzystej
- 29. Wywołanie metody z innego kontrolera
- 30. Składnia zapytania na wywołanie metody
To generalnie zły pomysł. Jeśli wiesz, że obiekt jest typu Subklasa, to odnieś go do tego i nie masz problemu. Jeśli metoda naprawdę należy do Base - umieść ją w Base. –