OOP operuje tak naprawdę na kilku pojęciach.
- dziedziczenie
- polimorfizm
- hermetyzacja
- abstrakcja
Nie ma w tym nic trudnego do pojęcia. Po prostu zacznij z tego korzystać.
HERMETYZACJA
Jest to inaczej enkapsulacja, czy kapsułkowanie. Wszystko odnosi się do tego, że chronimy swoje obiekty. Robisz to w życiu. No, może nie ty - ale większość ludzi. Jeśli coś jest prywatne to rozumie się przez to taką sytuację, że Twój sąsiad nie korzysta z Twojej bielizny. Przykładem protected jest Twoja książka, którą udostępniasz na chwilę swojemu koledze. Zastanów się co powinno być publiczne? Jedyne co mi przychodzi na myśl, to (w realnym życiu) pieniądze. W programowaniu jednak nie robił bym tego z modyfikatorem public.
To pierwsze i bardzo proste pojęcie. Warto robić wszystko z miejsca prywatne. Dopiero w chwili, gdy uznamy, że jest to potrzebne w hierarchii dziedziczenia to można zrobić protected. Na samym końcu myślimy o public. Jest to dobra praktyka, bo podejmujemy świadomą decyzję o tym, kiedy dana metoda czy pole powinno być publiczne.
DZIEDZICZENIE
Nie ma nic tu trudnego - odzedziczyłeś po którymś z rodziców oczy, może po innym kolor włosów itp. W programowaniu oznacza to tylko tyle, że klasa, która dziedziczy po innej przejmuje wszystkie jej metody publiczne i chronione. Ma do nich dostęp i może je wykorzystywać - tak samo z polami.
POLIMORFIZM
Często jest to pojęcie powiązane z dziedziczeniem. Oznacza to po prostu "wiele kształtów". Mi osobiście zrozumienie tego mechanizmu sprawiło najwięcej problemu. Chodzi o to, że jedna klasa może być wykorzystywana na wiele sposobów. Mamy metody rysujKwadrat(), rysujProstokąt, rysujOkrag - dzięki polimorfizmowi możemy zrobić tak, aby wywołać klasę Prostokat->rysuj() lub też klasę Kwadrat->rysuj(). Wszystkie te klasy będą sobie dziedziczyć po klasie Kształt (lub też implementować jej interfejs). Na moje, nie zaczynaj pogłębiania wiedzy z tego miejsca. Poznaj w swoim języku klasy, klasy abstrakcyjne, interfejsy. Popisz kilka programów, które wykorzystują te mechanizmy. Dopiero później będziesz próbować je modernizować wykorzystując polimorfizm.
ABSTRAKCJA
To jest zdaniem niektórych religia. Tworzy się tak opakowane klasy i tak przygotowane interfejsy aby udostępnić jak najwięcej możliwości rozszerzeń danego programu. Na przykład wysoce abstrakcyjne liby do obsługi baz danych oferują za każdym razem te same komendy do łączenia się z nią, a można wykorzystywać MySQL, SQLite, Mongo, Postgresa, itp. Czyli - nie ważne z jaką bazą danych się łączymy, mamy po prostu interfejs który wykorzystujemy do tego i nie musimy się o nic martwić. Tak samo możesz zrobić wysoce abstakcyjny interfejs - jakieś API swojej aplikacji. Dzięki temu będzie możliwe zrobienie jej GUI jako wygląd w przeglądarce internetowej, jako wygląd w aplikacji desktopowej, w macOS czy smartfonie. Po prostu nie będzie to ważne.