• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Polimorfizm w Javie.

Object Storage Arubacloud
+2 głosów
474 wizyt
pytanie zadane 2 listopada 2017 w Java przez Kapi2222 Obywatel (1,220 p.)

Cześć mam pytanie o polimorfizm w Javie. Załóżmy, że mamy klasę abstrakcyjną Zwierze oraz klasę dziedzicząca - Kot. I teraz kot posiada metodę wypijMleko() (ta metoda nie jest dostępna w klasie Zwierze - jest tylko i wyłącznie dostępna w klasie Kot). I teraz zgodnie z zasadą polimorfizmu chciałbym stworzyć obiekt: Zwierze kot = new Kot();. To teraz w jaki sposób odnieść się do metody wypijMleko()?? Bo jeżeli stworzę obiekt w taki sposób jak powyżej to się nie odniosę. Muszę stworzyć referencję typu Kot co mija się z zasadą polimorfizmu.

  • Jak sobie z taką sytuacją poradzić?
  • Jaki jest wtedy sens użycia polimorfizmu?
  • Czy można z tej sytuacji jakoś "wybrnąć" używając interfejsów?

Pozdrawiam :)

1 odpowiedź

0 głosów
odpowiedź 2 listopada 2017 przez adas94 Nałogowiec (29,200 p.)
wybrane 2 listopada 2017 przez Kapi2222
 
Najlepsza

Nie powinno się stosować zmiennych typu klasy abstrakcyjnej (Zwierze). Zrób sobie interfejs w którym stworzysz sygnaturę metody pij(), a następnie tworzysz sobie 3 klasy, które implementują ten interfejs. I później możesz stworzyć sobie zmienną typu interfejsu.

Interfejs zwierze = new Kot() // new Pies() // new Mysz()

Aby odnieść się do metody z interfejsu piszesz tylko zwierze.pij(); - i nieważne czy to będzie Kot, Pies itd... W taki sposób się wykorzystuje siłę polimorfizmu.

PS : 

(ta metoda nie jest dostępna w klasie Zwierze - jest tylko i wyłącznie dostępna w klasie Kot)

I tutaj sobie sam odpowiedziałeś na pytanie, jak chcesz się odnieść do metody klasy Zwierze, skoro ona nie istnieje? Musi istnieć, a w klasach pochodnych być nadpisana. Wywołując później tą metodę w jej miejsce jest podstawiona implementacja konkretnej klasy pochodnej. (na tym polega polimorfizm)

komentarz 2 listopada 2017 przez Kapi2222 Obywatel (1,220 p.)
Dzięki, myślałem właśnie o takim wykorzystaniu interfejsów. Ale nasuwa mi się kolejne pytanie, czy taka praktyka jest prawidłowa? Tzn. czy możemy używać interfejsów jako referencji do jakiegoś obiektu skoro interfejs jest tylko jakimś zbiorem operacji opisujących jakieś zachowania? Dodatkowo możesz mi powiedzieć czemu nie powinniśmy stosować zmiennych typu klasy abstrakcyjnej (czyli tych referencji)? Bo wiem oczywiście, że takich obiektów się nie tworzy ale nie wiem jeszcze czemu nie powinno się tworzyć np. Zwierze kot = new Kot(); gdzie Zwierze to własnie zmienna typu klasy abstrakcyjnej.
komentarz 2 listopada 2017 przez adas94 Nałogowiec (29,200 p.)
Na ostatnie pytanie odpowiem na początku. Nie powinno się używać klas abstrakcyjnych w taki sposób, ponieważ do tego służą interfejsy. Klasy abstrakcyjne stosuje się głównie do budowania struktury/drabinki klas.

A co do stosowania interfejsów jako referencji do obiektu, to właśnie jest to praktyka pożądana. Wyobraź sobie, że masz zadeklarowaną klasę człowiek, która ma mnóstwo funkcji  i zadeklarowanych interfejsów z różnych dziedzin. Poruszanie, jedzenie, spanie, parametry odnośnie wzrostu wieku itd itp. I teraz sobie wyobraź, że masz mapę 2D i pracujesz nad rozmieszczeniem elementów na tej mapie. I teraz użyjesz klasy Człowiek? Niepotrzebne ci są metody człowieka odnośnie jedzenia itd. Wtedy używasz interfejsu Poruszanie i wykorzystujesz tylko elementy "ruchowe" klasy Człowiek. Interfejs jest po to, aby ograniczać dostęp do klasy w pewien sposób. Działasz tylko na pewnych wyspecjalizowanych metodach zdefiniowanych w interfejsie Poruszanie.

A teraz sobie wyobraź, że chcesz na tej mapie rozmieścić zwierzęta, samochody i inne cuda. Będziesz tworzył nową implementację dla każdej jednej klasy? Nie, używasz dalej interfejsu Poruszanie i możesz pod to podpiąć każdą klasę, która ma zaimplementowane metody odnośnie poruszania. I najważniejsze to, że korzystasz z tych samych metod, które są w tym interfejsie.
komentarz 2 listopada 2017 przez Kapi2222 Obywatel (1,220 p.)
Bardzo fajny przykład, dziękuje już rozumiem zastosowanie interfejsów :)

Podobne pytania

0 głosów
1 odpowiedź 448 wizyt
pytanie zadane 16 października 2018 w Java przez Kubs Mądrala (5,190 p.)
0 głosów
1 odpowiedź 646 wizyt
pytanie zadane 17 sierpnia 2017 w Java przez Kubs Mądrala (5,190 p.)
0 głosów
1 odpowiedź 444 wizyt
pytanie zadane 4 sierpnia 2016 w Java przez itcloud Gaduła (3,380 p.)

92,568 zapytań

141,424 odpowiedzi

319,630 komentarzy

61,956 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...