• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak pojęliście sens OOP? Polimorfizm i dziedziczenie?

Object Storage Arubacloud
0 głosów
6,036 wizyt
pytanie zadane 30 stycznia 2016 w C i C++ przez Mateo500 Nowicjusz (150 p.)
Dodaje w dziale C i C++, choć w zasadzie programuje w Javie. Bardzo dobrze radzę sobie z programami ze SPOJ'a, ale słaby jestem z programowanie obiektowego. To dosyć abstrakcyjny temat i ciężko mi go zrozumieć. Jednak myślę że to dosyć kluczowe, w życiu każdego młodego programisty.

Filmiki naszego Kochanego Pana Mirka też jeszcze nie rozwiały moich wątpliwości.

Powiedzcie mi kiedy tak naprawdę pojęliście cały sens działania OOP? Co wam pomogło to zrozumieć? Jakieś wskazówki?

 

Pozdrawiam gorąco!!

4 odpowiedzi

+19 głosów
odpowiedź 30 stycznia 2016 przez event15 Szeryf (93,790 p.)
wybrane 30 stycznia 2016 przez Mateo500
 
Najlepsza

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. 

komentarz 30 stycznia 2016 przez efiku Szeryf (75,160 p.)
Wiadro plusów. Ach ta abstrakcja .. ;)
+3 głosów
odpowiedź 30 stycznia 2016 przez Grzyboo Nałogowiec (28,860 p.)
Fajnie jakbyś zaczął robić jakąś porządną grę np. w SFMLu. Gdy będziesz już miał istne spaghetti z kodu to zdasz sobie sprawę, że podzielenie tego wszystkiego na klasy bardzo pomoże w ogarnięciu projektu.
0 głosów
odpowiedź 30 stycznia 2016 przez kotfuterkowy Dyskutant (9,220 p.)
edycja 30 stycznia 2016 przez kotfuterkowy
Ja obiektówki uczyłem się z "Symfonii C++" Jerzego Grębosza. Może to nie jest najwłaściwsza książka, ale bardzo zrozumiała nawet dla początkujących. A w obiektowym C++ zwyczajnie łatwiej się pisze, no chyba że piszemy jakiś bardzo prosty program.

Ostatnio pisałem dla siebie jakiś prosty program w C# - myślałem, że napiszę go z marszu - tu kontrolka, która robi coś, tam zmienna, która przechowuje coś - wyszło kompletnie posiekane spagetti. Jak przepisałem kod obiektowo zrobiło się dużo czytelniej.
0 głosów
odpowiedź 31 stycznia 2016 przez Strategiusz Dyskutant (9,220 p.)
edycja 31 stycznia 2016 przez Strategiusz

O hermetyzacji było niedawno pytanie tu https://forum.pasja-informatyki.pl/102171/jaki-jest-sens-stosowania-hermetyzacji-w-c#c102257 z odpowiedziami, więc nie będę się powtarzał.

Spróbuję wytłumaczyć polimorfizm. W wielu językach musisz każdej zmiennej przypisać typ czy klasę. Musisz też przypisać typ lub klasę argumentu do metody czy funkcji. A co jeśli chcesz, żeby jako argument można było podać obiekt czy zmienną z jakichś kilku typów? Bo większość języków pozwala dziedziczyć tylko od jednego rodzica. Dziedziczenie od wielu rodziców wymagałoby zbyt wiele uwagi programisty, żeby ogarnąć co jest dziedziczone od kogo, więc stwierdzili, że dla prostoty niech będzie tylko dziedziczenie od jednego.

Są główne dwa sposoby na to, żeby można było jako argument podawać obiekty należące do wielu klas:

  1. Zrobić tak, żeby wymaganą klasą była jakaś nadklasa wspólna dla pożądanych obiektów - to ma tę wadę, że może się załapać wiele obiektów niepożądanych przy okazji
  2. Zamiast klasy jako typ podać interfejs. Interfejs to coś jak moduł, który jakby taguje klasę tak, że różne klasy mogą mieć wspólne różne rzeczy, niezależnie od swojego pochodzenia w hierarchii klasowej.

Jest jeszcze metoda przeciążania metody, ale jest często nieelegancka.

Podobne pytania

+1 głos
1 odpowiedź 343 wizyt
pytanie zadane 27 grudnia 2017 w C i C++ przez MAGNET Nowicjusz (160 p.)
0 głosów
1 odpowiedź 499 wizyt

92,565 zapytań

141,418 odpowiedzi

319,604 komentarzy

61,952 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...