Przesłanianie metod i pól - Przesłanianie metod |
Instrukcje dodatkowe - Programowanie w języku JAVA |
Wpisany przez Administrator |
Strona 4 z 8
Przesłanianie metod Czyli możliwe jest przeciążanie metod w dziedziczeniu. Pamiętamy też, że warunkiem koniecznym dla istnienia dwóch , metod o tej samej nazwie była różnica między nimi polegająca na zastosowaniu innej ilości lub innego typu parametrów. czyli nie można było zdefiniować dwóch metod o tej samej nazwie i tym samym zestawie parametrów. Przekonajmy się:
Zad. 2: Zmodyfikuj powyższy program: w klasie punkt dodaj jeszcze jedną metodę o nazwie ustaw_wspolrzedne, która przyjmuje dwa argumenty typu double: nX oraz nY, która nic nie robi.
Jak widać na powyższym obrazku, zdefiniowanie jeszcze raz metody o takiej samej nazwie i takich samych argumentach nie uda się: system wyświetla informację o błędzie (czerwone kółeczko z wykrzyknikiem): Komunikat błędu: Podana metoda jest już zdefiniowana w klasie punkt. Teraz, idąc tym samym tokiem rozumowania, zdefiniowanie tej klasy w klasie punkt3d, która dziedziczy z klasy punkt powinno zakończyć się tym samym błędem - przecież dziedziczy ona z klasy punkt, więc będzie "miała" już odziedziczoną metodę ustaw_wspolrzedne, która przyjmuje dwa argumenty typu double: nX oraz nY, właśnie po klasie punkt. Sprawdźmy jednak, czy mamy rację:
Zad. 3: Zmodyfikuj powyższy program. Dodaj do klasy punkt3d metodę ustaw_wspolrzedne, która przyjmuje dwa argumenty typu double: nX oraz nY. (oczywiście usuń powodującą błąd metodę, którą dodaliśmy w zadaniu 2.)
Zauważ, że system nie alarmuje czerwonym kółeczkiem o wystąpieniu błędu. Na zdrową logikę, powinien: klasa punkt3d ma teraz 2 metody o takiej samej nazwie i tych samych parametrach: jedną odziedziczoną z klasy punkt, a drugą - "swoją" - dodaną na poziomie klasy potomnej - punkt3d. Dlaczego tak się dzieje? Odpowiedź jest prosta: właśnie odkryliśmy przysłanianie metod. Przyjrzyjmy się definicji: Przysłanianie metod to stosowanie dwóch lub więcej metod o takiej samej nazwie i argumentach, w klasach bazowej i potomnych.
Czyli w jednej klasie nie może się identyczna metoda powtórzyć, za to może się powtórzyć w klasach dziedziczących i dziedziczonych. No dobra, ale teraz pewnie powiesz tak: skoro klasa punkt3d ma teraz dwie metody ustaw_wspolrzedne, która przyjmuje dwa argumenty typu double: nX oraz nY - jedną z klasy bazowej a drugą "swoją". Jeśli ją więc wywołamy, to którą z nich uruchomi i skąd będzie wiedziała którą ma uruchomić? Sprawdźmy na prostym przykładzie. Zad. 4: Zmodyfikuj powyższy program: skopiuj funkcjonalność metody ustaw_wspolrzedne (double nX, double nY) do klasy punkt3d. W każdej z nich jednak wstaw komunikat informujący, czy metoda jest wywołana z klasy bazowej (punkt) czy potomnej (punkt3d).
Zauważ, że obiekt p1 użył metody ze swojej klasy (co było do przewidzenia), natomiast obiekt p2 użył tej metody, która była w jego własnej klasie, ponieważ przysłoniła ona metodę w klasie bazowej (punkt). Wniosek: obiekty, w sytuacji, kiedy dana metoda jest przysłoniona (powtarza się) wywołują tą, która jest najbliżej ich: w ich własnej klasie lub najbliższej klasie bazowej.
|