OOP: Polimorfizam [Objašnjen]

Saturday, April 16, 2016


O Objektno-Orijentisanom Programiranju pišem već nekoliko blog postova i obradio sam nekoliko ključnih konceptima, pa je neophodno spomenuti i Polimorfizam, kada bih morao da odgovorim sa samo jednom rečenicom šta je to polimorfizam u OOP , to bi bila pojava da se jedan objekat može javiti u više oblika i više izdanja što polimorfizam i znači, a to je višeobličje, više i detaljnije će biti objašnjeno u daljem textu. Također ako nista savjetujem vam da pročitate blog post o OOP o kojem sam pričao u prošlom blog postu link je ovdje.

Glavna ideja oko polimorfizma je ta da baznu klass, koju nasljeđuje više klasa mogu izvršavati iste funkcije svaka na svoj način. Ako pogledamo slijedeću sliku:


Ovo je primjer koji sam koristio i u blog postu vezanom za nasljeđivanje sa razlogom koristim i ovdje jer polimorfizam i nasljeđivanje idu usko jedno uz drugo, čak polimorfizam ne bi mogao biti moguć bez koncepta nasljeđivanja.

Pa da krenemo sa konkretnim primjerom vezanim za sliku iznad... Ako u našem programu kreiramo abstraktnu klasu tipa podatka Osoba. te nakon toga kreiramo klase Gost, VIPGost, Zaposlenik, Konobar, Šef sale, Upravnik... oni će direktno ili indirektno biti pod klase, klase Osoba.

Pošto nam je klasa osoba abstraktna klasa ili po mogućnosti interfejs, nakon što naslijedimo u klasi Gost klasu Osoba, klasa Gost poprima njene sve funkcije i atribute koji je opisuju plus svoje specifične atribute i funkcije koje su relevantne samo za klasu Gost, nakon što to isto uradimo i sa klasom Zaposlenik pa sve do dna ove "hijerarhije" sa slike, imamo situaciju da je klasa Osoba bazna abstraktna klasa i da ne može imati svoje instance, tj ne možemo imati njegove instance, ali zato možemo imati instance izvedenih klasa koje nasljeđuju klasu Osoba i imaju sve funkcije kao i klasa Osoba plus svoje.

Ako govorimo o osnovnim funkcijama klase Osoba to bi npr. bila funkcija: predstaviSe(), ovu funkciju bi naravno imale sve izvedene klase, i upravo na ovom primjeru možemo vidjeti osobinu polimorfizma, pri pozivu ove funkcije svaka od izvedenih klasa bi na svoj način se "predstavila" i tako smo postigli da se prije svega klasa osoba javila u više oblika, a zatim i to da se sa jednom funkcijom svaka od tih izvedenih klasa predstavila na sebi svojstven način.

Sa polimorfizmom smo postigli to da se ista funkcionalnost (predstaviSe()), može različito manifestirati u različitim klasama u najčešćem obliku kao izvedena klasa bazne klase.

Također jako popularan primjer je iz game developmenta, kada imamo klasu Enemy tj. Neprijatelj, u igricama naravno imamo više protivnika, više specifičnih oblika u kojem se protivnik može javiti, a kao podloga tome svemu je bazna klasa Enemy koju svi protivnici u igrici nasljeđuju.

Polimorfizam kao riječ na prvu zvuči jako kompleksno, ali u praksi to nije, u OOP polimorfizam je upravo ono što ta riječ i znači kada se rastvi na dva dijela, poli - više, morfizam - oblik.

Kao jedan od zadnjih primjera ću navesti jedan polu-programerski i polu-gamerski primjer, recimo da imamo niz tipa podatka Neprijatelj/Enemey i pri implementaciji jednog od levela naše igrice imamo potrebu da nasumično iscrtamo različite vrste naših neprijatelja na mapi, prolazimo for petljom kroz naš niz i za svaki objekat u tom nizu pozivamo funkciju nacrtajLika(), kako for petljom prolazimo kroz naš niz tipa Neprijatelj (bazna klasa), pozivaju se funkcijac nacrtajLika() za svaku izvedenu klasu koja se nalazi u nizu i ovime smo postigli da imamo jedan niz tipa bazne klase koji će u sebi čuvati različite elemente izvedenih klasa, pozivajući istu funkciju koju svi imaju dobijamo specifične rezultate za klasu sa kojom razgovaramo u tom trenutku.


Kao rezultat ovoga ćemo imati da smo nacrtali sve likove iz niza, pozivanjem samo jednog niza, samo jedne funkcije imamo različite rezultate tj. različite oblike klase Neprijatelj.


Nadam se da sam vam ovim blog postom približio pojam polimorfizma, ako vam je u ovim trenucima jasno šta je polimorfizam, ali vam nije jasno zašto je bitan... ne brinite i ne morate da o tome razmišljate sada... kada budete malo više ulazili u priču oko OOP polimorfizam će se sam nametati kao logično objašnjenje i rješenje.

Ako niste preporučujem vam da pročitate blog post vezan za Objektno orijentisani programiranje koji možete pronaći ovdje kao i blog post vezan za koncept Enkapsulacije link ovdje.

Pozdrav! Almir Vuk | AV Development | http://almirvuk.blogspot.ba/

You Might Also Like

2 comments

  1. Hvala na objasnjenju. Ovaj tekst je jasan, kao i ostali Vaši tekstovi o OOP-u. Meni su poslužili da potvrdim svoje znanje o OOP konceptima.

    ReplyDelete