Polimorfizm, dziedziczenie i hermetyzacja w JAVA
W poniższym artykule znajdziesz omówienie polimorfizmu, dziedziczenia i hermetyzacji w JAVA.
Polimorfizm
Polimorfizm (z greckiego, wiele form) oznacza w programowaniu obiektowym możliwość posługiwania się pewnym zbiorem akcji za pomocą jednego interfejsu. Konkretna akcja zostaje wybrana w konkretnej sytuacji. Najprostszym przykładem polimorfizmu może być kierownica samochodu. Kierownica (czyli interfejs) wygląda zawsze tak samo niezależnie od tego, jaki mechanizm kierowania zastosowano w aucie. Kierownicy używasz zawsze w taki sam sposób niezależnie od tego czy samochód posiada zwykłą przekładnię kierowniczą, czy wyposażony jest we wspomaganie. Jeśli umiesz posługiwać się kierownicą, możesz jeździć dowolnym typem auta.
Ta sama zasada znajduje zastosowanie w programowaniu. Weźmy pod uwagę na przykład stos (rozumiany jako lista obsługiwana zgodnie ze strategią pierwszy na wejściu – ostatni na wyjściu (ang. last-in, first-out — LIFO). Możesz napisać program, który będzie wymagał użycia trzech typów stosu. Jeden będzie przechowywał wartości całkowite, drugi wartości zmiennoprzecinkowe, a ostatni znaki. We wszystkich tych przypadkach algorytm implementujący stos będzie taki sam, mimo że poszczególne stosy przechowują różne dane. W języku programowania strukturalnego musiałbyś jednak utworzyć trzy różne zestawy operacji na stosie różniące się nazwami i parametrami funkcji. W języku Java dzięki polimorfizmowi wystarczy utworzyć jeden ogólny zestaw operacji na stosie, które będą działać we wszystkich trzech przypadkach. Zatem jeśli potrafisz posługiwać się w Javie jednym stosem, to możesz korzystać z najróżniejszych typów stosów.
Koncepcję polimorfizmu można przekazać w najbardziej ogólny sposób jako „jeden interfejs, wiele metod”. Oznacza to możliwość zaprojektowania ogólnego interfejsu dla grupy powiązanych akcji. Polimorfizm pozwala ograniczyć złożoność programu poprzez zastosowanie tego samego interfejsu dla określenia ogólnej klasy akcji. Zadaniem kompilatora jest wybranie określonej akcji (czyli metody), którą należy zastosować w konkretnej sytuacji. Programista nie musi dokonywać tego wyboru w programie. Wystarczy, że używa ogólnego interfejsu.
Dziedziczenie w JAVA
Dziedziczenie jest procesem, w którym obiekt otrzymuje właściwości innego obiektu. Mechanizm ten wspiera tworzenie hierarchicznych klasyfikacji. Jeśli się nad tym bliżej zastanowisz, to zauważysz, że większością naszej wiedzy możemy zarządzać właśnie za pomocą hierarchicznych (zstępujących) klasyfikacji. Na przykład jabłko odmiany Złota Reneta należy do ogólniejszej klasyfikacji jabłka, która z kolei jest częścią klasy owoc, która należy do ogólniejszej klasy żywność. Klasa żywność posiada określone właściwości (np. wartość odżywcza), które odnoszą się do jej klas pochodnych, w tym klasy owoc. Oprócz właściwości dziedziczonych po klasie żywność klasa owoc może posiadać własne, specyficzne właściwości (soczystość, słodkość itd.), które odróżniają ją od innych podklas klasy żywność. Klasa jabłko definiuje z kolei właściwości specyficzne dla jabłek (rośnie na drzewach, w klimacie umiarkowanym itd.). Klasa Złota Reneta dziedziczy właściwości wszystkich wymienionych klas i dodaje
własne, które czynią ją unikatową.
Gdyby nie hierarchie dziedziczenia, każdy obiekt musiałby jawnie definiować całą swoją charakterystykę. Zastosowanie mechanizmu dziedziczenia powoduje, że obiekt definiuje jedynie te właściwości, które czynią go unikatowym w klasie. Pozostałe atrybuty może dziedziczyć po klasie nadrzędnej. W ten sposób mechanizm dziedziczenia w JAVA sprawia, że obiekt może być traktowany jako specyficzna instancja ogólniejszej klasy.
Hermetyzacja w JAVA
Hermetyzacja jest mechanizmem programowym wiążącym dane z kodem, który na nich operuje. Rozwiązanie takie zapobiega przypadkowym interferencjom z zewnętrznym kodem oraz niepoprawnemu użyciu danych. W językach obiektowych powiązanie kodu z danymi tworzy się w taki sposób, że powstaje samodzielna czarna skrzynka. Zawiera ona wszystkie niezbędne dane i kod. Z takiego połączenia danych i kodu powstają właśnie obiekty. Innymi słowy, obiekt jest konstrukcją umożliwiającą hermetyzację.
Dane i kod wewnątrz obiektu mogą pozostawać prywatne dla obiektu lub zostać udostępnione publicznie. Prywatne dane i kod są dostępne jedynie dla innych składowych tego samego obiektu. Innymi słowy, prywatne dane i kod nie są dostępne dla programu istniejącego na zewnątrz obiektu. Natomiast publiczne dane i kod, mimo że zdefiniowane wewnątrz obiektu, mogą być używane przez inne części programu. Typowo publiczne składowe obiektu są definiowane, aby utworzyć interfejs kontrolujący sposób wykorzystania prywatnych składowych obiektu.
W języku Java podstawową jednostką hermetyzacji jest klasa. Klasa definiuje postać obiektu. Określa dane obiektu oraz kod, który operuje na tych danych. Java używa specyfikacji klasy do tworzenia obiektów. Obiekty są instancjami klasy. Innymi słowy, klasa stanowi plan konstrukcji obiektów.
Kod i dane tworzące obiekt nazywamy składowymi klasy. W szczególności dane zdefiniowane w klasie określane są mianem zmiennych składowych lub zmiennych instancji. Kod działający na tych danych nazywamy metodami składowymi lub po prostu metodami. Metoda jest w języku Java określeniem podprogramu. Jeśli znasz język C/C++, to metoda w języku Java stanowi odpowiednik funkcji w języku C/C++.
Java. Przewodnik dla początkujących. Wydanie VI, Autor: Herbert Schildt, Wydawnictwo: Helion