W rozdziale
Klasy - Dziedziczenie (Inheritance) wspominamy o tym, że klasa dziedzicząca z innej klasy (nadklasy) jest tego samego typu co ta nadklasa.
Podobnie w rozdziale
Interfejs jako typ danych podkreślamy to, że obiekt klasy implementującej interfejs jest obiektem typu tego interfejsu.
Taki rodzaj relacji w Javie jest określany mianem relacji
IS - A.
Jeśli weźmiemy teraz pod uwagę to, że:
- dana nadklasa może być rozszerzana przez wiele klas
- interfejs może być również implementowany przez wiele klas
to każda z tych wielu klas ma prawo dostarczyć własną implementację metod nadklasy lub interfejsu.
Dzięki temu nadklasa lub interfejs mogą przybierać różne formy i taką zdolność nazywamy
polimorfizmem.
Polimorfizm na bazie klasy
Załóżmy, że tworzymy aplikację do zarządzania dokumentami. Na początek posiadamy cztery klasy. Jako bazę mamy nadklasę -
DocumentItem,
która dla uproszczenia posiada tylko jedną metodę -
getDescription.
Mamy też trzy konkretne klasy pochodne, które dostarczają własne implementacje metody
getDescription.
Mówimy, że metody te przesłaniają metodę z klasy bazowej, co zresztą jest zgodne z treścią rozdziału
Przesłanianie metod.
Tym samym klasa bazowa
DocumentItem staje się bytem przyjmującym
wiele form, w zależności od tego, której implementacji użyjemy.
Podczas działania programu może ona występować zarówno w postaci obiektu klasy
WordDocument,
ExcelDocument,
jak i
PdfDocument. Zobaczmy w programie:
Po uruchomieniu programu na konsoli pojawi się wydruk pokazujący że mi tego, iż każdy obiekt jest typu
DocumentItem,
to jednak występuje on w trzech postaciach (mamy trzy różne wydruki):
Polimorfizm na bazie interfejsu
W przypadku interfejsu sprawa wygląda niemalże identycznie. Różnica polega na samej idei interfejsów, które przede wszystkim definiują nam to, co ma zostać
wykonane przez klasę implementującą, a nie jak to ma to być zrobione. Posiadając trzy klasy implementujące ten sam interfejs, mamy również
trzy różne formy
dla tego samego typu - w tym przypadku dla
PrinterService. Każda z trzech klas przesłania metodę
printDocument:
Na koniec zobaczmy, jak to będzie wyglądało w programie:
Ponownie, mimo że każdy obiekt jest typu
PrinterService, to jednak występują one równocześnie pod postacią trzech różnych typów wywodzących się z
PrinterService (stąd mamy trzy różne wydruki, każdy z innej klasy implementującej interfejs):
Autor: Jarek Klimas
Data: 03 stycznia 2024
Labele: Backend, Podstawowy, Java
Czy informacje, które otrzymałeś, były pomocne?
Jeśli tak, zapraszam Cię do podarowania mi kawy.
Masz pytanie dotyczące prezentowanego materiału?
Coś jest dla Ciebie niejasne i Twoje wątpliwości przeszkadzają Ci w pełnym zrozumieniu treści?
Napisz do nas maila, a my chętnie znajdziemy odpowiednie rozwiązanie.
Najciekawsze pytania wraz z odpowiedziami będziemy publikować pod rozdziałem.
Nie czekaj. Naucz się programować jeszcze lepiej.