Przesłanianie metod i pól Drukuj
Ocena użytkowników: / 7
SłabyŚwietny 
Instrukcje dodatkowe - Programowanie w języku JAVA
Wpisany przez Administrator   

Z tej lekcji dowiesz się:

-jaki wpływ na dziedziczenie ma przeciążanie metod

-co to jest przysłanianie pól i metod

nauczysz się:

-przysłaniać pola i metody

 


Co powinieneś już wiedzieć?

-co to jest dziedziczenie

-co to jest przeciążanie metod

Wszystkie niezbędne wiadomości oraz wyjaśnienia potrzebne do zrozumienia tej lekcji znajdują się w poprzednich lekcjach w tym kursie.

Przypomnijmy z poprzedniej lekcji: przeciążanie metod to używanie dwóch lub więcej metod o takiej samej nazwie lecz z różnymi parametrami.

 


 

Przypomnijmy sobie, na rozgrzewkę kilka umiejętności dot. przeciążania metod. Spróbuj poniższe zadanie zrobić sam:

 

Zad. 1: Napisz program, który:

-definiuje klasę punkt, zawierającą

*pole typu double o  nazwie wspX;

*pole typu double o nazwie wspY;

*metodę ustaw_wspolrzedne, która przyjmuje dwa argumenty typu double: nX oraz nY i podstawia te wartości odpowiednio w pola wspX oraz wspY

-definiuje klasę punkt3d, zawierającą:

*pole typu double o  nazwie wspZ;

*metodę ustaw_wspolrzedne, która przyjmuje trzy argumenty typu double: nX, nY oraz nZ i podstawia te wartości odpowiednio w pola wspX wspY oraz wspZ

Stwórz obiekt p1 klasy punkt oraz obiekt p2 klasy pubkt3d.

Wywołaj metodę ustaw_wspolrzedne (double nX, double nY) dla p1 z dowolnymi poprawnymi wartościami (np.: 10, 20).

Wywołaj metodę ustaw_wspolrzedne (double nX, double nY) dla p2 z dowolnymi poprawnymi wartościami (np.: 10, 20).

Wywołaj metodę ustaw_wspolrzedne (double nX, double nY, double nZ) dla p2 z dowolnymi poprawnymi wartościami (np.: 10, 20, 30).

 

Spróbuj sam napisać ten program. Listing znajduje się na końcu instrukcji w dziale Rozwiązania.

Efekt uruchomienia programu:

Co ustaliliśmy dzięki temu programowi?

1) Możliwe jest przeciążanie metod w klasach bazowych i potomnych

2) Klasa potomna dziedziczy metody klasy bazowej

3) Klasa bazowa nie ma dostępu do metod klasy potomnej - co jest zupełnie logiczne. Jeśli nie wierzysz, to spróbuj wywołać metodę ustaw_wspolrzedne (double nX, double nY, double nZ) dla p2 z dowolnymi poprawnymi wartościami (np.: 10, 20, 30)

 

 


 

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.

 

 


 

Odwołania krzyżowe

Zajmijmy się jeszcze jednym wątkiem dot. odwołań. Co by było, gdybym chciał, w zaistniałej w zad.4. sytuacji, z klasy potomnej odwołać się do przesłoniętej metody w klasie bazowej. Taka możliwość musi być (w praktyce często jest stosowana). Czyli trzeba obejść zasadę, że w przypadku przesłonięcia obiekt odwołuje się do najbliższej mu metody o tej architekturze i odwołać się do przesłoniętej metody ustaw_wspolrzedne(double nx, double nY), która znajduje się w klasie bazowej (punkt) z poziomu obiektu klasy pochodnej punkt3d.

 

Zad. 5. Zmodyfikuj powyższy program. Odwołaj się do przesłoniętej metody ustaw_wspolrzedne(double nx, double nY), która znajduje się w klasie bazowej (punkt) z poziomu obiektu klasy pochodnej (punkt3d).

Zrobimy to za pomocą słowa kluczowego super: jeśli pamiętasz, to przy odwoływaniu się do konstruktora bazowego w przypadku przeciążeń używaliśmy tego słowa: super. Oto kod programu wraz z wywołaniem:

 

Jak widać na załączonej ilustracji, można odwołać się z klasy potomnej do przesłoniętej metody z klasy bazowej w sposób pośredni, poprzez inną metodę, w której użyto słowa super.

Przeanalizuj, które komunikaty zostały wywołane przez poszczególne metody, i czy rzeczywiście metoda ustaw_wspolrzedne2 odwołała się do metody ustaw_wspolrzedne w klasie punkt (bazowej)?

Oczywiście, że tak.

Przysłaniania metod mamy już opanowane, na końcu lekcji będzie kilka ćwiczeń utrwalających.

 


 

Przesłanianie pól

Przesłanianie pól działa analogicznie jak przysłanianie metod. Również taka sama jest kolejność dostępu: pierwszeństwo ma metoda pole przysłaniające, jako to, które jest "na wierzchu" dla obiektów dziedziczących.

Aby się o tym przekonać dodajmy przysłaniające pole wspX oraz wspY do klasy punkt3d:

Zad. 6.: Zmodyfikuj powyższy program. Dodaj pola wspX oraz wspY do klasy punkt3d tym samym przesłaniając pola bazowe.

 

 

Zmodyfikowaliśmy tylko jedną linijkę: 15, gdzie dopisaliśmy dwa nowe pola. Dzięki temu metoda ustaw_wspolrzedne odnosi się teraz do przysłaniających pól, które zdefiniowaliśmy przed chwilą. A co stało się z polami, które są dziedziczone? Odpowiedź jest bardzo prosta: klasa punkt3d ma teraz dwa pola wspX (bazowy i przysłaniający) oraz dwa pole wspY również (bazowy i przysłaniający).

Zad. 7. Zmodyfikuj powyższy program. Zmień wartości pól wspX oraz wspY - bazowych i przysłaniających. Wyświetl wartości tych pól odpowiednią metodą.

Oto kod programu (od początku klasy punkt3d, gdyż klasa punkt ani wcześniejsze linie kodu nie były zmienione w tym zadaniu):

 

 

Oto wynik uruchomienia programu:

Zauważ, że w linijkach: 32 i 33 ustawiane są wartości pól bazowych, co wykorzystane jest w metodzie us,taw_wspolrzedne3, wywołanej w linijce 44.

Ponadto, w linijkach 36 i 37 następuje odwołanie do pól bazowych poprzez słowo super, natomiast w linijkach 38 i 39 występuje odwołanie do pól lokalnych w klasie pochodnej za pomocą słowa this. Odwołania te wykorzystane są w metodzie wyswietl_wspolrzedne, użytej w linijce 45.

 

 


Zadania utrwalające

 

Zad. 8.: Napisz program, który:

-definiuje klasę kwadrat, która:

-zawiera pole bokA typu double

-zawiera metodę ustaw_a, która przyjmuje argument typu double i podstawia wartość argumentu jako wartość pola bokA

-definiuje klasę prostokat, która:

-zawiera pole o nazwie bokB

-zawiera metodę ustaw_b, która przyjmuje argument typu double i podstawia wartość argumentu jako wartość pola bokB


Podstaw wartości boków: bokA = 56, bokB = 65; (użyj odpowiednich konstruktorów)

Wyświetl wartości tych boków.

 

Zad. 9.: Zmodyfikuj powyższy program. Dodaj przysłaniającą metodę ustaw_a do klasy prostokat. Odwołaj się do jednej i drugiej metody ustaw_a z poziomu obiektu klasy prostokat.

Zad. 10.: Zmodyfikuj powyższy program. Dodaj przysłaniające pole bokA do klasy prostokat. Odwołaj się do jednego i drugiego pola bokA klasy prostokat. Ustaw wartości tych pól na 23 oraz 32. Wyświetl te wartości na ekranie.



Rozwiązania

 

Zad. 1.

Zad. 8.:

Zad.9.:

Zad. 10.:

 

 

Dziękuję za uwagę.