![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 1 Pomógł: 0 Dołączył: 9.10.2011 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Otóż czytam poradniki, przeglądam książki i nie mogę znaleźć dobrego wytłumaczenia idei i działania polimorfizmu. Czy może ktoś podrzucić jak najprostszy przykład i go opisać? Czym polimorfizm różni się od dziedziczenia czy implementowania interfejsu po prostu? I czy ten kod: http://wklejto.pl/106402 , wykorzystuje polimorfizm? Pozdrawiam, Łukasz |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 248 Pomógł: 38 Dołączył: 29.06.2008 Ostrzeżenie: (0%) ![]() ![]() |
Kolego, ważna rzecz: kwadrat jest prostokątem, a nie odwrotnie. czyli powinno być:
, a wa konstruktorze kwadratu przekazujemy tylko jeden argument (przecież boki ma takie same). A po za tym chyba ok, chociaż jakoś specjalnie się nie zagłębiałem w kod. Po za tym przykład użycia tych klas może wyglądąć tak: (pisane z palca): np masz jakąś klasę, która w argmencie przyjmuje obiekt klasy Figury
i możesz robić coś takiego:
To jest wlasnie polimorfizm; jeśli w konstruktorze klasy Przykład wywołasz jakąś metodę obiektu figuryObj, to php rozpozna którą metodę ma wywołąć (czyt. metodę której podklasy implementującej interfejs Figury wywołać). W Twoim przykładzie Figury to interfejs, ale równie dobrze może to być zwykła klasa. Interfejsu i polimorfizmu w zrozumieniu tych pojęć nie należy łączyć. Ten post edytował kaem 9.10.2011, 19:16:22 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 2 Pomógł: 0 Dołączył: 29.12.2008 Ostrzeżenie: (0%) ![]() ![]() |
Uzycie dziedziczenia czy interfejsu to sposoby na implementacje polimorfizmu.
Upraszczajac - w polimorfizmie chodzi o to zeby (w naszym wypadku) obiekty bedace instancjami roznych klas reagowaly na pewien wspolny zbior wlasciwosci. Dzieki temu mozesz sobie chocby spokojnie wrzucic do jednej tablicy trojkaty, kwadraty, kola etc, a potem uzyc np foreach i kazdym obiekcie wywolac ta sama metode (zeby np poznac ich laczne pole). Kod jest wg mnie OK (przynajmniej jesli chodzi o ilustracje dzialania polimorfizmu). Ten post edytował macwoj 13.10.2011, 21:01:36 |
|
|
![]()
Post
#4
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Gdyby jakoś prosto zilustrować polimorfizm to jego sedno można streścić tak: byt reaguje na zdarzenia zależnie od warunków. Dość prostym i zrozumiałym przykładem polimorfizmu jest przeciążanie funkcji. Wywołana metoda produkuje różne wyniki w zależności od tego jakiego typu dane otrzymała lub ile ich otrzymała. Inaczej może choćby reagować gdy otrzyma liczbę, a inaczej gdy jest to tablica lub obiekt określonej klasy. Jest więc do pewnego stopnia pewnym bytem abstrakcyjnym. Wywołujesz go zawsze jednakowo, ale efekty jego działania w zależności od sytuacji, kontekstu, mogą dawać różne wyniki.
Klasyczny już niemal przykład to choćby funkcja licząca pole ![]() -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#5
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) ![]() ![]() |
Dość prostym i zrozumiałym przykładem polimorfizmu jest przeciążanie funkcji. Wywołana metoda produkuje różne wyniki w zależności od tego jakiego typu dane otrzymała lub ile ich otrzymała. Inaczej może choćby reagować gdy otrzyma liczbę, a inaczej gdy jest to tablica lub obiekt określonej klasy. Jest więc do pewnego stopnia pewnym bytem abstrakcyjnym. Wywołujesz go zawsze jednakowo, ale efekty jego działania w zależności od sytuacji, kontekstu, mogą dawać różne wyniki. A oto przykład tego czym polimorfizm nie jest.Jest ogromna różnica pomiędzy przeciążaniem metod (ang. overloading) a ich nadpisywaniem (and. overriding). To co opisał ~thek to overloading, podczas którego mechanizm polimorfizmu najzwyklej w świecie nie działa! Polimorfizm jest to mechanizm podczas, którego obiekt może występować jako obiekt różnych typów. Oznacza to, że obiekt zmienia swoją formę w zależności od referencji. Przykład z polami figur jest OK. Przykład z przeciążaniem metod jest fatalny! ---update--- Można by się zagłębiać w czeluście teoretyzowania i powiedzieć, że przecież przykład z przeciążeniem metod to mechanizm ad-hoc polimorfizm ale to nie jest clue sprawy. To nadal nie jest polimorfizm na poziomie obiektów, o którym mowa w tym przypadku i w 99% procentach rozmów o polimorfizmie. Zresztą ad-hoc polimorfizm to tylko polimorfizm z nazwy. Ten post edytował mike 14.10.2011, 08:35:23 |
|
|
![]()
Post
#6
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Owszem mike, masz rację. To z przeciążaniem metod jest pewnym wariantem polimorfizmu, a nie jego sendem, ale chciałem tak na "chłopski rozum" wytłumaczyć czym on między innymi jest, bez wskakiwania w coś mocno abstrakcyjnego. Przedstawiony przeze mnie prosty przykład jest w oparciu o wiedzę z C/C++, gdzie przeciążanie jest mechanizmem polimorficznym. Widać to zwłaszcza w przypadku przeciążania operatorów. Ogólnie można powiedzieć, że najłatwiej polimorfizm wychwytuje się w językach statycznie typowanych, gdzie nawet rzutowanie jest przecież mechanizmem polimorficznym. Wiem... Można to uznać za teoretyzowanie, ale chyba przykład z rzutowaniem będzie budził mniej Twoich kontrowersji
![]() Gdyby tak się przyjrzeć to polimorfizm zależnie od swego "typu" można implementować w zasadzie jako klasy abstrakcyjne z ich pochodnymi lub interfejsy po których dziedziczymy i tym samym wymuszamy posiadanie tych samych funkcji, właściwości, do których zależnie od kontokstu można się odwoływać i wtedy jest to faktycznie polimorfizm na poziomie obiektu. Zwróć jednak uwagę, że nie jest to w przypadku php wygodne z prostego powodu: dynamiczne rzutowanie i konieczność jawnego odwoływania do przodków jeśli metoda jest nadpisana w potomku. W statycznie typowanych "sam sobie" po przodkach szuka pasujących do wywołania o ile nie może dokonać pewnych konwersji (choćby pomiędzy double, float i int). -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 12.06.2025 - 23:41 |