Four Tenets of OOP

Abstrakcja

Abstrakcja umożliwia wyodrębnienie elementów charakteryzujących dany obiekt, które są istotne dla rozwiązywanego problemu.

Każdy obiekt w systemie służy jako model abstrakcyjnego „wykonawcy”, który może wykonywać pracę, opisywać i zmieniać swój stan oraz komunikować się z innymi obiektami w systemie, bez ujawniania, w jaki sposób zaimplementowano dane cechy.

„An abstraction denotes the essential characteristics of an object that distinguish it from all other kinds of object and thus provide crisply defined conceptual boundaries, relative to the perspective of the viewer.”

—G. Booch, Object-Oriented Design With Applications

Enkapsulacja (ukrywanie implementacji, hermetyzacja)

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.

Polimorfizm

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.

W C++ jest możliwy polimorfizm statyczny wykorzystujący szablony. Nie wymaga on późnego wiązania - metody wiązane są na etapie kompilacji.

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.

Obiekt-Interfejs-Klasa

Obiekt

  • Jest elementem zawierającym zarówno dane, jak i funkcje na nich działające (metody lub operacje)

  • Wykonuje operację po otrzymaniu żądania (lub komunikatu) od klienta (innego obiektu)

  • Wewnętrzny stan obiektu jest zaenkapsulowany

Interfejs

Określa kompletny zbiór żądań, jakie mogą być wysyłane do obiektu. Interfejs obiektu nie mówi nic o implementacji obiektu – różne obiekty mają prawo różnie implementować żądania.

Klasa

Implementacja obiektu jest zdefiniowana przez jego klasę:

  • Klasa specyfikuje wewnętrzne dane obiektu i ich reprezentację oraz definiuje operacje, które obiekt może wykonywać

  • Obiekty powstają w wyniku tworzenia egzemplarzy klas.

Za pomocą dziedziczenia klas można definiować nowe klasy w kategoriach klas już istniejących.

Klasa abstrakcyjna – klasa, której głównym celem jest zdefiniowanie wspólnego interfejsu dla jej podklas (klas pochodnych). Operacje, które klasa abstrakcyjna deklaruje, ale których nie implementuje, nazywa się operacjami abstrakcyjnymi. W C++ są to metody czysto wirtualne.

Klasy, które nie są abstrakcyjne, nazywamy klasami konkretnymi:

_images/KlasyObiekty.png