– 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
abstract class BodyGuard
{
 abstract void applyMartialArts(Attacker attacker);

 void shoot(Attacker attacker)
 {
    gun.shoot(attacker);
 }

 void saveClientLife(Attacker attacker)
 {
  if (attacker.hasGun())
     shoot(attacker);
  else
     applyMartialArts(attacker);
 }
}
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.

3
Zadanie
Podstawy Java,  poziom 3lekcja 3
Niedostępne
Wprowadzanie kodu
Nie musisz myśleć, po prostu go wyklep! Brzmi to trochę paradoksalnie, ale czasami Twoje palce „pamiętają” kod lepiej niż Twój świadomy umysł. Właśnie dlatego trening w tajnym centrum CodeGym zawiera zadania wymagające wprowadzania kodu. Wprowadzając kod, przyzwyczajasz się do składni oraz zarabiasz ciemną materię. Co więcej, walczysz z własnym lenistwem!

– Masz rację. To podobne do interfejsu z wieloma zaimplementowanymi metodami.

– Tak, ten rodzaj klasy abstrakcyjnej jest powszechny wśród standardowych klas Java SE.