[]
Inheritance ve Polymorphism arasındaki bağ, benzerlik.
Java çalışıyorum, bir türlü kavrayamadım şunu.
1 . class a, class b extends a olsun her ikisinde de do_something() methodu mevcut olsun. her ikisinde de aynı method olduğuna göre zaten overriding yapmıyor mu?
2. obj b = new b(); => bunu çalıştırdığın zaman zaten b nin methodunu kullanıyor.
3. obj a = new b(); => bunu çalıştırdığnı zaman yine b nin methodunu çalıştırıyor.
her ikisi de run-time değil mi? upcasting?
bu ikisi arasındaki fark nedir?
polymorphism extend edildiği zaman methodların override olması dışında nedir? zaten bu inheritance ın bir özelliği değil mi? ya da inherit edilen objelerin methodları override edebilme yeteneğine mi polymorphism deniyor?
olabilecek en ama en basit anlatımla ve nerede ne amaçla kullandığına dair aydınlatabilir misiniz beni?
1 . class a, class b extends a olsun her ikisinde de do_something() methodu mevcut olsun. her ikisinde de aynı method olduğuna göre zaten overriding yapmıyor mu?
2. obj b = new b(); => bunu çalıştırdığın zaman zaten b nin methodunu kullanıyor.
3. obj a = new b(); => bunu çalıştırdığnı zaman yine b nin methodunu çalıştırıyor.
her ikisi de run-time değil mi? upcasting?
bu ikisi arasındaki fark nedir?
polymorphism extend edildiği zaman methodların override olması dışında nedir? zaten bu inheritance ın bir özelliği değil mi? ya da inherit edilen objelerin methodları override edebilme yeteneğine mi polymorphism deniyor?
olabilecek en ama en basit anlatımla ve nerede ne amaçla kullandığına dair aydınlatabilir misiniz beni?
1. B'de do_something() methodunu yeniden yazdiysan override ettin demektir. Eger yazmasaydin B A'nin do_something() methoduna sahip olacakti.
2. ve 3.de obje ve class isimleri birbirine karistigi icin kendi ornegimi yazip anlatayim:
Object x = new A();
Burada herhangi bir upcasting veya downcasting yok. Olayi biraz derinlemesine aciklayayim, x dedigimiz sey bir A objesi degil aksine hafizadaki bir A objesine referans. Kodu soyle de yazabiliriz:
Object x;
x = new A();
Burada ilk satirda bir referans yarattik ve type'i icin Object dedik. Yani x bir Object objesine referans ve su an itibariyla hicbir objeyi isaret etmiyor, yani null. Ikinci satirda da new A() diyerek bir A objesi olusturduk hafizada, bunu x'e assign ederek de x'in hafizadaki gosterdigi objeyi az once yarattigimiz obje olarak belirledik. x'in type'i bu noktada degismedi, x hala bir referans ve gosterdigi objenin type'i Object. A class'i dogal olarak Object'in bir subclass'i oldugu icin assign ederken de bir hata almadik. Her sey compile-time'da cozuldu.
Eger ki bu x'i run-time'da Object olarak degil de A olarak kullanmak istersen upcast etmen gerecek, ((A) x).a'yaOzelBirMethod() gibi veya eger ki A isteyen bir fonksiyona x'i gonderseydin hata alacaktin cunku x'in type'i Object(her ne kadar x'in gosterdigi sey bir A olsa da jvm onu kontrol etmiyor, statik olarak en basta senin belirledigin type'a bakiyor). Ama az once yaptigimiz gibi cast ederek gonderebilirsin, bu da yine bir run-time cost'a sahip. Cunku jvm cast etmeden once bunlarin cast edilebilir olup/olmadigini kontrol edecek, eger ki oyle degillerse hata dondurecek.
Inheritance dedidigimiz sey superclass'in yapisini ve davranislarini subclass'ta kullanabilmemiz anlamina geliyor kabaca. Polymorphism ise bu yapi ve davranisi subclassta degistirebilmemizi, yani bir bakima bazi seyleri override etmemizi saglayan kavram. Ayni zamanda polymorphism sayesinde farkli type'a sahip objeleri sanki ayni seylermis gibi kullanabiliyoruz. Polymorphism'i olanakli kilan sey de inheritance, sonuc olarak inheritance iliskisi olmayan iki class'i sanki ayni seylermis gibi kullanamazsin.
2. ve 3.de obje ve class isimleri birbirine karistigi icin kendi ornegimi yazip anlatayim:
Object x = new A();
Burada herhangi bir upcasting veya downcasting yok. Olayi biraz derinlemesine aciklayayim, x dedigimiz sey bir A objesi degil aksine hafizadaki bir A objesine referans. Kodu soyle de yazabiliriz:
Object x;
x = new A();
Burada ilk satirda bir referans yarattik ve type'i icin Object dedik. Yani x bir Object objesine referans ve su an itibariyla hicbir objeyi isaret etmiyor, yani null. Ikinci satirda da new A() diyerek bir A objesi olusturduk hafizada, bunu x'e assign ederek de x'in hafizadaki gosterdigi objeyi az once yarattigimiz obje olarak belirledik. x'in type'i bu noktada degismedi, x hala bir referans ve gosterdigi objenin type'i Object. A class'i dogal olarak Object'in bir subclass'i oldugu icin assign ederken de bir hata almadik. Her sey compile-time'da cozuldu.
Eger ki bu x'i run-time'da Object olarak degil de A olarak kullanmak istersen upcast etmen gerecek, ((A) x).a'yaOzelBirMethod() gibi veya eger ki A isteyen bir fonksiyona x'i gonderseydin hata alacaktin cunku x'in type'i Object(her ne kadar x'in gosterdigi sey bir A olsa da jvm onu kontrol etmiyor, statik olarak en basta senin belirledigin type'a bakiyor). Ama az once yaptigimiz gibi cast ederek gonderebilirsin, bu da yine bir run-time cost'a sahip. Cunku jvm cast etmeden once bunlarin cast edilebilir olup/olmadigini kontrol edecek, eger ki oyle degillerse hata dondurecek.
Inheritance dedidigimiz sey superclass'in yapisini ve davranislarini subclass'ta kullanabilmemiz anlamina geliyor kabaca. Polymorphism ise bu yapi ve davranisi subclassta degistirebilmemizi, yani bir bakima bazi seyleri override etmemizi saglayan kavram. Ayni zamanda polymorphism sayesinde farkli type'a sahip objeleri sanki ayni seylermis gibi kullanabiliyoruz. Polymorphism'i olanakli kilan sey de inheritance, sonuc olarak inheritance iliskisi olmayan iki class'i sanki ayni seylermis gibi kullanamazsin.
- yasli ateist (22.07.18 16:16:58 ~ 16:21:18)
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.com
OOP 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.
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.com
OOP 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.
- emrahday (24.07.18 09:51:25 ~ 13:52:40)
1