background image

Enkapsulacja, dziedziczenie i polimorfizm są obok abstrakcji podstawowymi założeniami, czyli paradygmatami 
programowania obiektowego.

Enkapsulacja, inaczej hermetyzacja jest to ukrywanie implementacji. Zapewnia, że obiekt nie może zmieniać stanu 
wewnętrznego innych obiektów w nieoczekiwany sposób. Tylko wewnętrzne metody obiektu są uprawnione do 
zmiany jego stanu. Każdy typ obiektu prezentuje innym obiektom swój interfejs, który określa dopuszczalne 
metody współpracy. Pewne języki osłabiają to założenie, dopuszczając pewien poziom bezpośredniego 
(kontrolowanego) dostępu do wnętrza obiektu. Ograniczają w ten sposób poziom abstrakcji. Przykładowo, w 
niektórych kompilatorach języka C++ istnieje możliwość tymczasowego wyłączenia mechanizmu enkapsulacji; 
otwiera to dostęp do wszystkich pól i metod prywatnych, ułatwiając programistom pracę nad pośrednimi etapami 
tworzenia kodu i znajdowaniem błędów.

Hermetyzacja uodparnia tworzony model na błędy polegające np. na błędnym przypisywaniu wartości oraz 
umożliwia wykonanie czynności pomocniczych (jak np. pobranie z konta 10% wypłacanej kwoty jako prowizji) 
lub obsługę sytuacji wyjątkowej (np. brak wymaganych środków). 

Dzięki stosowaniu hermetyzacji można budować modele rzeczywistości jako struktury składające z 
mniejszych modułów, z których każdy ma pewne określone dane i określone metody wpływania na ich stan i 
sprawdzania go. Na przykład w tworzeniu modelu samochodu można użyć modułu silnika, który ma określony 
szereg danych wewnętrznych (np. opisujących jego stan w trakcie pracy) i metod wewnętrznych (np. pobranie 
paliwa, wywołanie reakcji, ruch wirnika). Wszystko to jednak jest nieistotne dla użytkownika (a nawet nie powinno 
być dostępne), który ma możliwość użycia tylko zapłonu i wyłączenia silnika. 

Z pełną hermetyzacją mamy do czynienia wtedy, gdy dostęp do wszystkich pól w klasie jest możliwy tylko i 
wyłącznie poprzez metody, lub inaczej mówiąc gdy wszystkie pola w klasie znajdują się w sekcji prywatnej (lub 
chronionej).
----------------------------------------------------------------------------------------------------------------------
Polimorfizm (z gr. wielopostaciowość) - mechanizmy pozwalające programiście używać 
wartości, zmiennych i podprogramów na kilka różnych sposobów[1]. Inaczej mówiąc jest to możliwość 
wyabstrahowania wyrażeń od konkretnych typów.

Referencje i kolekcje obiektów mogą dotyczyć obiektów różnego typu, a wywołanie metody dla referencji 
spowoduje zachowanie odpowiednie dla pełnego typu obiektu wywoływanego. Jeśli dzieje się to w czasie działania 
programu, to nazywa się to późnym wiązaniem lub wiązaniem dynamicznym. Niektóre języki udostępniają bardziej 
statyczne(w trakcie kompilacji)rozwiązania polimorfizmu - na przykład szablony i przeciążanie operatorów w C++.

Przykładowo podczas implementacji stosu nie jest bardzo istotne jakiego typu wartości będą na nim 
przechowywane. Można napisać ogólne algorytmy obsługujące stos i ewentualne ukonkretnienie pozostawić 
systemowi. Mechanizmy umożliwiające takie udogodnienia nazywane są właśnie polimorfizmem.

Przeciążanie (lub przeładowywanie, ang. overload) pozwala nazwać tak samo kilka podprogramów operujących na 
różnych danych i następnie obsługiwać te dane w jednolity sposób. Np. inaczej dodawane są liczby całkowite, a 
inaczej zmiennopozycyjne ale wygodnie obie te operacje nazywać po prostu dodawaniem i oznaczać symbolem 
"+". W językach bez przeciążania operatory te muszą się różnić. Przeciążane mogą być np. operatory, funkcje, 
metody, procedury. W niektórych językach niektóre operatory lub funkcje są przeciążone, ale programista nie może 
ich dodatkowo dociążać lub przeciążać własnych.
Wybór konkretnego podprogramu następuje w miejscu wywołania na podstawie jego nazwy oraz statycznych 
typów argumentów, a czasami również na podstawie typu oczekiwanej wartości zwracanej (np. w Adzie). Jest to 
więc polimorfizm statyczny.
----------------------------------------------------------------------------------------------------------------------
Dziedziczenie to w programowaniu obiektowym operacja polegająca na stworzeniu nowej klasy na bazie klasy już 
istniejącej. 

Dziedziczenie porządkuje i wspomaga polimorfizm i enkapsulację dzięki umożliwieniu definiowania i tworzenia 
specjalizowanych obiektów na podstawie bardziej ogólnych. Dla obiektów specjalizowanych nie trzeba 
redefiniować całej funkcjonalności, lecz tylko tę, której nie ma obiekt ogólniejszy. W typowym przypadku powstają 
grupy obiektów zwane klasami, oraz grupy klas zwane drzewami. Odzwierciedlają one wspólne cechy obiektów.