Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Polimorfizm - wytłumaczenie
Proxxx
post 9.10.2011, 14:03:30
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
Go to the top of the page
+Quote Post
kaem
post 9.10.2011, 19:14:39
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ć:
  1. class Kwadrat extends Prostokat implements Figury
, 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
  1. class Przyklad
  2. {
  3. public function __construct(Figury $figuryObj){}
  4. }

i możesz robić coś takiego:
  1. $instance = new Przykład($kwadratObj albo $prostokatObj albo $koloObj itd...);

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
Go to the top of the page
+Quote Post
macwoj
post 13.10.2011, 20:54:41
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
Go to the top of the page
+Quote Post
thek
post 13.10.2011, 23:23:14
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 smile.gif Wiadomo, że dla różnych figur powinna ona użyć innego wzoru, a więc dynamicznie reaguje na to jakiej klasy obiekt jako parametr otrzyma. Raz będzie to kwadrat, raz trójkąt a innym razem koło. Jeszcze inną sytuacją może być choćby funkcja drukuj, która może różnie zareagować na otrzymane dane. Może je bowiem przekształcić do różnych postaci, zależnie od tego na jakie urządzenie są one kierowane. Tutaj zawsze te same dane wejściowe mogą przyjąć zupełnie inną formę wyjściową.


--------------------
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
Go to the top of the page
+Quote Post
mike
post 14.10.2011, 08:23:55
Post #5





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


Cytat(thek @ 14.10.2011, 00:23:14 ) *
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
Go to the top of the page
+Quote Post
thek
post 14.10.2011, 11:11:20
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 smile.gif W końcu masz to o co Ci chodziło: obiekt jest jednocześnie różnego typu, zależnie od kontekstu użycia.

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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.04.2024 - 06:09