2010-04-06 13 views
23

Powiel możliwe:
Why is super.super.method(); not allowed in Java?Java Jak wywołać metodę grand rodziców?

Załóżmy Mam 3 klas A, B i C, każdy rozszerzenie poprzedniego.

Jak wywołać kod A.myMethod() z C.myMethod() jeśli B realizuje również 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

Dlaczego miałbyś to zrobić? Czy możesz dać przykład? – Macarse

Odpowiedz

18

Nie możesz. To jest celowe.

Klasa zapewnia interfejs (jak w koncepcji, a nie słowo kluczowe Java) do podklas. Postanowił nie dawać bezpośredniego dostępu do funkcji A.myMethod. Jeśli potrzebujesz tej funkcji, użyj innej metody (inna nazwa, spraw, aby była to protected). Jednak prawdopodobnie lepiej jest "preferować kompozycję niż dziedziczenie".

+0

Dzięki chłopaki! Spróbuję przerobić mój projekt. – Arkaha

+0

Arkaha, zobacz moją odpowiedź na twoje pytanie. Syntaktycznie można wywołać metodę zdefiniowaną przez superklasę, która nie jest bezpośrednim przodkiem (twój * super *). Ale musisz mieć do tego ważny powód. –

0

Nie jestem pewien, czy potrafisz. Java domyślnie wszystkie metody są wirtualne. Oznacza to, że najprostsze rozwiązanie nie będzie działać: zadeklaruj zmienną typu A, przypisz do niej instancję C, a wywołanie myMethod spowoduje wywołanie C.myMethod.

Możesz spróbować odzwierciedlić typ A i wywołać jego metody bezpośrednio. Byłoby ciekawie zobaczyć, co stanie się w tym przypadku, ale byłbym zaskoczony, gdyby wirtualna wysyłka się nie wydarzyła ...

2

Nie możesz i nie powinieneś.

Jest to oznaka złego projektu. Zmień nazwę metody lub dołącz wymaganą wspólną funkcję w innej metodzie lub klasie narzędziowej.

+1

Odbicie * także * nie zapewnia tego sposobu, normalne zasady polimorfizmu środowiska wykonawczego ** nadal będą obowiązywały **. Nie możesz nawet zaimplementować 'super.myMethod()' używając refleksji, nie mówiąc już o teoretycznym 'super.super.myMethod()'. –

+0

prawidłowe. zaktualizowany. – Bozho

+0

Niekoniecznie musisz to zrobić, kiedy definiujesz klasy wewnętrzne (na przykład, definiujesz detektory działania w Swingach lub klasach oddzwaniania). Poza takimi sytuacjami, tak, jest to zły projekt, ale * sam * nie jest. Składnia języka Java tak czy inaczej obsługuje (zobacz moją odpowiedź na pytanie Arkaha). –

Powiązane problemy