– Cześć, Amigo! Wczoraj uczyłeś się o klasach abstrakcyjnych. Najwyższy czas poszerzyć naszą wiedzę. Zamierzam Ci pokazać, jak poprawnie używać klas abstrakcyjnych.
Trudno wymyślić z życia wziętą analogię dla klas abstrakcyjnych. Klasa stanowi zazwyczaj model pewnego bytu. A klasa abstrakcyjna zawiera metody, które nie zostały zaimplementowane, ale może zawierać także takie, które zaimplementowane już zostały. Co to oznacza? Jakie analogie dla klas abstrakcyjnych możemy odnaleźć? Czy w życiu istnieje coś podobnego?
Właściwie, to tak. Wyobraź sobie, że na przenośniku taśmowym mamy podwozie prawie już skończonego samochodu. Można w nim zainstalować stary, podrasowany silnik, albo taki, który z założenia jest bardzo wydajny. Możemy wybrać do wnętrza skórzaną bądź sztuczną tapicerkę. A zatem, konkretna implementacja tego samochodu nie jest jeszcze ustalona. Co więcej, podwozie mogłoby zostać użyte do wytworzenia wielu konkretnych implementacji. Ale nikt nie chce tego samochodu w jego obecnej formie. I to jest właśnie klasyczna klasa abstrakcyjna: tworzenie jej instancji nie miałoby sensu, więc nie możesz tego zrobić; klasa ma sens tylko ze względu na licznych prawowitych spadkobierców, którzy zostaną stworzeni na jej obraz i podobieństwo.
– To dość łatwe.
Możemy podać jeszcze więcej podobnych analogii. Na przykład interfejsy z kilkoma zaimplementowanymi metodami. Weźmy pod uwagę profesjonalnego tłumacza. Bez określenia języka źródłowego i docelowego nasz tłumacz będzie jedynie «tłumaczem abstrakcyjnym». Pomyśl też o ochroniarzu. Wiemy, że zna sztuki walki, a zatem ochroni swojego klienta. Ale dopiero ze „szczegółów implementacji” konkretnego ochroniarza dowiemy się, które sztuki walki opanował i w jaki sposób będzie tego klienta chronił.
Spójrzmy na poniższy przykład:
Kod Java | Opis |
---|---|
|
Klasa BodyGuard określa, jak radzić sobie z atakiem: strzelać czy raczej użyć sztuk walki.
A jednak, nie została określona żadna konkretna sztuki walki, mimo że jesteśmy pewni, że ta umiejętność istnieje. Możemy utworzyć wielu różnych ochroniarzy (poprzez dziedziczenie klas). Wszyscy będą potrafili ochronić swojego klienta i zastrzelić napastnika. |
– Masz rację. To podobne do interfejsu z wieloma zaimplementowanymi metodami.
– Tak, ten rodzaj klasy abstrakcyjnej jest powszechny wśród standardowych klas Java SE.
GO TO FULL VERSION