polymorphism yapmak icin nesneler arasinda inheritance yapmak bir yontemdir, yani polymorhism cok daha genel bir durumdur. hayvanlar orneginden aciklarsam, iki tane hayvan sinifimiz olsun. Aslan ve Gergedan. aslanini yemekYe() diye bir methodu olsun, ve bu yemek ye methodunda aslan et yer. gergedanin da yemekYe() methodu olsun ve gergedan bu methodda ot yer. simdi bu iki hayvan "Hayvan" sinifini "extend" yapsin yani aralarinda inheritance bagi olsun. Hayvan sinifinda da yemekYe() methodu var, bunun alt siniflari da Aslan ve Gergedan bu methodu "override" ediyor ve kendine gore bu yemekYe() methodunu et veya ot yenebilecek sekilde duzenliyor.
simdi gelelim bu nesnler arasinda polymorhism nasil olusur. Ornegin bir de Insan diye baska bir nesnemiz, bu nesne icinde hayvanlariBesle() diye method olsun. Bu method sadece Hayvan besleyecek sekilde duzenlenmis, yani bu methoda hangi hayvani gonderirsek onu besliyor. Su sekilde bir method;
public void hayvanlariBesle( Hayvan hayvan ){...}
dikkat edersen bu method sadece hayvan kabul ediyor ve aslan veya gergedan diye ayrim yapmiyor. Simdi bu methoda aslan veya gergedan hayvanini gonderebilir miyiz? gonderebiliiz ve gonderdigimizde polymorhphism olur. yani soyle;
Aslan aslan = new Aslan(); // aslan nesnesi yarattik
Gergedan gergedan = new Gergedan(); // gergedan nesnesi yarattik
Insan insan = new Insan(); // insan nesnesi yarttik
simdi insan nesnesi icine beslenmesi amaciyla aslan ve gergedani gonderiyoruz.
insan.hayvanlariBesle(aslan);
insan.hayvanlariBesle(gergedan);
burada haynvanlari besle methodu sadece hayvan kabul etse de aslan ve gergedan aslinda bir hayvan oldugu icin yani hayvandan inheritance yaptiklari icin bu aslan ve gergedan nesnesini de kabul eder. Iste bu polymorhismin basladigi noktadir, peki nedir bunun devami;
insan nesnesinin hayvanlariBesle() methodu icine bakalim;
class Insan{
public void hayvanlariBesle( Hayvan hayvan ){
// buraya dikkat burada hayvan diye bir nesnemiz var
// buraya gonderilen hayvan aslan da olabilir gergedan da olabilir.
// hayvan nesnesi cok bicimlidir (polymorphic) yani ne oldugu belli degil
if (hayvan instanceOf Aslan){ // gelen bu hayvan bir aslan mi?
Aslan aslan = hayvan; // downcasting
aslan.yemekYe();
} else if (hayvan instanceOf Gergedan){ // gelen bu hayvan bir gergedan mi?
Gergedan gergedan = hayvan; // downcasting
gergedan.yemekYe();
}
}
}
ne yarari var peki bu polymorhism in, insan sinifi icine aslan ve gergedan kabul eden iki farkli hayvanlari besle methdu yapmak yerine sadece hayvan ve onun alt nesnelerini (aslan ve gergedan) kabul eden tek bir metod yapmis olduk. diger turlu iki method yapmamiz gerekirdi, yani;
public void hayvanlariBesle( Aslan aslan){...}
public void hayvanlariBesle( Gergedan gergedan){...}
ama bu iki method birlesti, ve bu method icinde polymorphic tek bir Hayvan nesnesi olmus oldu. ihtiyaca gore birlesmese de olurdu, bu birlesmedigi durumlara da "method overloading" diyoruz, o ayri bir konu.
Polymorhism ile ilgili daha onceden yazdigim su eksisozluk girdisine de bakabilirsin. orda daha uzun uzun anlattim.
eksisozluk.comOOP yi gercek hayat gibi dusun, gercek hayati modelleyen bir yontemdir. sen ve kardesin insan nesnesinden inheritance yaparsin, yani "extend" edersin. ama anne ve baban icin sen ve kardesin "evlat" dir. yani anne baban "evladim" dediginde bu kastettigi kisi sen veya kardesin olabilir. ornegin annen "evladimi cok seviyorum" dediginde sevidigi kisi sen de olabilirsin kardesin de, yani bu sevdigi "evlat' nesnesi polymorphic dir.