2. Bölüm Çok Şekillilik (Polymorphism)
Transkript
2. Bölüm Çok Şekillilik (Polymorphism)
y ca de m Java ile Nesne Merkezli ve Fonksiyonel Programlama w w w .s el so f t.a 2. Bölüm Çok Şekillilik (Polymorphism) Akın Kaldıroğlu www.javaturk.org Kasım2015 ca de m y KüçükAmaÖnemliBirKonu Ø Budosyaveberaberindekitüm,dosya,kod,vb.eğitimmalzemelerinintüm w Ø w Ø w .s el so f Ø t.a Ø haklarıAkınKaldıroğlu’naaittir. Bueğitimmalzemelerinikişiselbilgilenmevegelişiminizamacıyla kullanabilirsinizveisteyenlerihttp://www.javaturk.org adresineyönlendirip, bumalzemelerinengüncelhallerinialmalarınısağlayabilirsiniz. Yukarıdabahsedilenamaçdışında,bueğitimmalzemelerinin,ticari olsun/olmasınherhangibirşekilde,toplubireğitimfaaliyetindekullanılması, buamacayönelikolsun/olmasınbasılması,dağıtılması,gerçekyada sanal/Internetortamlarındayayınlanmasıyasaktır.Böylebirihtiyaçhalinde lütfenbenimle,[email protected] adresindeniletişimegeçin. Buvebenzerieğitimmalzemelerinekatkıdabulunmakyadadüzeltmeve eleştirilerinizibanailetmekistersenizçoksevinirim. BolJava’lıgünlerdilerim. www.javaturk.org 2 ca de m y İçerik Ø Bubölüm,nesne-merkezliprogramlamanınentemel kavramlarınolançokşekilliliği (polymorphism)elealacaktır. w w w .s el so f t.a Ø Java’nıntipleriarasındakimümkündönüşümler(cast) incelenecektir. www.javaturk.org 3 y ca de m t.a w w w .s el so f Upcasting (Yükseltme) www.javaturk.org 4 ca de m y Upcasting - I Upcasting Referans el so f t.a Ø Birreferansıyadanesneyialıponu üsttipindenbirreferansaatamaya upcasting (yükseltme)denir. Ø Upcasting,yerinegeçebilme özelliğindendolayıherzaman güvenlidir. Ø Dolayısıylacastoperatörü“()” kullanmayagerekyoktur. Nesne w w w .s Manager m = new Manager(); Employee e = m; ya da doğrudan Employee e = new Manager(); Manager m = new Director(); Emlpoyee e = new Director(); www.javaturk.org 5 ca de m y Upcasting - II w .s el so f t.a Ø Hatırlayın,kalıtımbirgenelleştirme-özelleştirmeilişkisi kurgular. Ø Hiyerarşideaşağıdayeralanyanidahaözeltiplerdenolan nesneler,yerinegeçebilme(substitutability)özelliğinden dolayı,yukarıdayeralanyanidahagenelolantiplerin referanslarınaatanabilir. Ø Budurumdaherözeltipinnesnesi,aynıhiyerarşidekidaha geneltiptenolanreferanslaraatanabilir. w w Employee e = new Employee(); e = new Manager(); e = new Director(); Manager m = new Director(); www.javaturk.org 6 y ca de m NedenUpcasting? el so f t.a Ø Dil,tabiatıitibariylegenelifadeleriledahaçokşeyanlatma eğilimindedir. Ø Upcasting deprogramiçerisindedahagenelreferanslarla, hertürlüalttiptenolannesneyigöstermeyeteneğisağlar. Ø Employee eifadesi“herhangibirçalışan”anlamınagelir. Ø Managermifadeside“herhangibiryönetici”anlamınagelir. Ø Buiseprogramlarımızıbasitleştirir. w w w .s Employee e = new Employee(); Manager m = new Manager(); Director d = new Director(); e = m; e = d; m = d; www.javaturk.org 7 ca de m y MetotParametrelerindeUpcasting el so f t.a Ø Upcasting,sıklıklametotparametrelerindedegörülür. Ø Budurum,birmetoda,dahageneltiptenparametre almasınarağmen,otipintümalttiplerindenparametre geçilerekçağrılmasıylaa oluşur. Ø paySalary()metodunun,parametreolarakEmployee alması demek,kendisinehertürEmployee nesnesinin geçilebilmesidemektir. w w w .s public class PayrollOffice { public void paySalary(Employee e){ double salary = e.calculateSalary(); System.out.println("Paying a salary of " + salary + " to " + e.getName()); } } www.javaturk.org 8 y w w w .s el so f t.a ca de m TestPayrollOffice.java www.javaturk.org 9 y ca de m t.a w w w .s el so f Çok Şekillilik (Polymorphism) www.javaturk.org 10 y ca de m Polymorphism- I Ø EskiYunanca’da poly çok,morph iseşekil demektir. t.a Ø Polymorphism deçokşekillilik demektir. Ø Çokşekilliolanisereferanslardır. el so f Ø Polymorphism,birreferansın,zamanınfarklıanlarında, kendiyadaalttiplerindenolanfarklınesneleri gösterebilmesinedenir. Ø Örnektekie vem referanslarıpolymorphictir. w w w .s Employee e = new Employee(); Manager m = new Manager(); Director d = new Director(); e = m; e = d; m = d; www.javaturk.org 11 y ca de m Polymorphism- II t.a Ø Polymorphism biryaklaşımdır,upcasting iseonu gerçekleştirenmekanizmadır. Ø Polymorphismsayesindearayüzilegerçekleştirmeyi ayırabiliriz. w w w .s el so f Ø Referans,üsttiptenolduğuiçinarayüzü,onaatanan nesnelerise,alttiplerdenolabildiğinden,gerçekleştirmeyi ifadeederler. Ø Dolayısıyla,aynıarayüze sahipnesnelerarasında,nesnenin gerçektipinibilmeden,değişmeleryapabilirsiniz. Ø Unutmayın,birkalıtımhiyerarşisindekinesneler,enazından enyukarıdakinesneninarayüzüne sahiptirler. www.javaturk.org 12 y so f t.a Ø Buyüzdenpolymorphism dahagüzelbirtanımla,iki referansınbirbirleriyle haberleşip,birbirlerinin gerçektiplerinibilmemeleri demektir. ca de m Polymorphism- III w w w .s el Ø PayrollOffice nesnesi sadeceEmployee nesnesini bilmekte,alttiplerini (Manager veDirector)ise bilmemektedir. www.javaturk.org 13 ca de m y Interface–Implementation Ayırımı- I w w w .s el so f t.a Ø Polymorphismsayesindearayüzilegerçekleştirmeyi ayırabiliriz. Ø Üsttiptenolanreferans,tipininarayüzünü,onaatanan nesnelerisegerçekleştirmeyiifadeederler. Ø Buşekildegerçektehanginesneninkullanıldığınıbilmeden, sadeceüsttipeyaniarayüze bağlısınıflaryazılabilir. Programto aninterfacenotanimplementation. Ø Yani,elinizdebirkalıtımhiyerarşisivarsa,kodunuzuo hiyerarşininarayüzünübelirleyenenüsttipinegöreyazın, alttakisınıfları,gerçekleştirmeleri,gözönünealmayın. Ø Buşekildehiyerarşidekieklemeveçıkarmalardan etkilenmezsiniz. www.javaturk.org 14 ca de m y Interface–Implementation Ayırımı- II so f t.a Ø PayrollOffice, Employee hiyerarşisindeki değişimlerden etkilenmez, w w w .s el Ø ÇünküPayrollOffice, sadeceEmployee’nin arayüzünü bilmektedir. www.javaturk.org 15 y ca de m t.a w w w .s el so f Polymorphic Metotlar www.javaturk.org 16 y ca de m PolymorphicMetotlar- I Ø Polymorphism,metotlariçindefarklıbiranlamasahiptir. so f t.a Ø Birmetodunpolymorphic yaniçokşekilliolması, arayüzünün sabitolmasınarağmen,overriding sayesinde, pekçokgerçekleştirmeyesahipolmasıanlamınagelir. w w w .s el Ø Dolayısıylafarklıgerçekleştirmeler,aynıarayüzünarkasında saklanabilir,birbirleriyerinegeçecekşekildekullanılabilir. www.javaturk.org 17 y t.a w w w .s el so f Ø Buhiyerarşideki work()metodunuele alalım. Ø Bumetodunbir arayüzüolmasına karşın5tane gerçekleştirmesi vardır. Ø Pekibirpolymorphic metodunarayüzüile gerçekleştirmeleri arasındakiilişki nasıldır? ca de m PolymorphicMetotlar- II www.javaturk.org 18 y Employee e = new Employee(); e.work(); Manager m = new Manager(); m.work(); Director d = new Director(); d.work(); Employee e = new Employee(); e.work(); e = new Manager(); e.work(); e = new Director(); e.work(); w w w .s el so f t.a Ø Buhiyerarşidekiwork() metodufarklıreferanslar üzerindeçağrılırsa,hangi gerçekleştirmelerçalışır? Ø Birmetodunarayüzü,o metodunkendisiüzerinde çağrıldığıreferansıntipi tarafındanbelirlenir. Ø Ometodunhangi gerçekleştirmesinin çalışacağıisereferansın gösterdiğinesne tarafındanbelirlenir. ca de m PolymorphicMetotlar- III www.javaturk.org 19 y ca de m Arayüz- Gerçekleştirme so f t.a Ø Employee tipindee referansıüzerindeçağrılabilecekolan metotlarıbelirleyene’nintipiolanEmployee sınıfının arayüzüdür. Ø Amaçalışmazamanında(run-time)hangiwork() metodununçağrılacağınıbelirleyenisee’ningösterdiği nesnenintipidir. w w w .s el Employee e = new Employee(); e.work(); => Employee’s work() e = new Manager(); e.work() => Manager’s work() e = new Director(); e.work(); => Director’s work() www.javaturk.org 20 y w w w .s el so f t.a ca de m TestPolymorphism.java www.javaturk.org 21 ca de m y BaşkaBirAçıdanPolymorphism- I Ø w .s el so f t.a Ø Dahaönce“birmetodunarayüzü,ometodunkendisi üzerindeçağrıldığıreferansıntipitarafındanbelirlenir.O metodunhangigerçekleştirmesininçağrılacağıise referansıngösterdiğinesnetarafındanbelirlenir.”dedik. Ø Budurumuşöyledeifadeedebiliriz: Ø Birmetodunbirreferansüzerindeçağrılıpçağrılamayacağı, derlemezamanında(compile-time)belirlenir.Çünkübukarar, referansıntipinebakılarakalınır. Referansın tipindeometotvarsaçağrılabiliryoksaçağrılamaz. Ø Amagerçektehangimetodunçağrılacağı,referansın w w gösterdiğinesneyebağlıolduğundanvebudaancakçalışma zamanındabelliolacağından,derlemezamanındabilinemez. www.javaturk.org 22 ca de m y BaşkaBirAçıdanPolymorphism- II Ø Aşağıdakikoddahangiwork()çağrılır? el so f t.a public class HR{ public Employee getAnEmployee(){...} } w w w .s HR hr = new HR(); Employee e = hr.getAnEmployee(); e.work(); => Hangi work() çağrılır? www.javaturk.org 23 ca de m y BaşkaBirAçıdanPolymorphism- III Ø Busorununcevabı“bilinemez”dir. el so f t.a Ø Kodabakarak,derlemezamanındaEmployee tipindenbir nesnedöndürdüğünügördüğümüzbirmetodun,gerçekte Employee’nin hangialttipinidöndürdüğünükodabakarak bilmemizmümkündeğildir. w w w .s Ø Bubilgiancakçalışmazamanında,dönennesneningerçek tipibilininceortayaçıkar. www.javaturk.org 24 w w w .s el so f t.a ca de m y TestHR.java www.javaturk.org 25 y Employee e = new Manager(); e.work(); w w w .s Aslında çağrılan Manager’in work() metodudur!!! el so f t.a ca de m Employee’nin work() metodunun çağrılacağını düşnebilirsiniz! www.javaturk.org 26 y ca de m t.a w w w .s el so f Binding www.javaturk.org 27 y ca de m Bağlama(Binding) w w w .s el so f t.a Ø Programlamadillerindebağlama(binding),değişken, metot,vb.özelliklerindilinelemanlarıylailişkilendirmesidir. Ø ÖrneğinJava’da“*”sembolününmatematikselçarpma işleminebağlanmasıdilintasarımzamanındayapılmıştır. Ø Dillerdetemeldeikibağlamazamanıönemlidir: Ø Statikbağlama(static binding):Statikbağlamadaözelliklerin, dilinelemanlarıylailişkilendirmesiçalışmazamanındanönce yapılırveprogramınçalışmasısırasındadadeğişmez. Ø Dinamic bağlama(dynamic binding):Dinamikbağlamadaise özelliklerin,dilinelemanlarıylailişkilendirmesiçalışma zamanındayapılırveprogramınçalışmasısırasındadeğişebilir. www.javaturk.org 28 ca de m y Method Binding Ø Programlamadillerinde,operationların,metotlara bağlanmalarınadamethod binding (metotbağlama) denir. el so f t.a Ø Nesnemerkezlidillerdedemetotlarınbağlanmasındada statik vedinamik olmaküzereikifarklıbağlamasöz konusudur w w w .s Ø Metotpolymorphismi,dynamic binding (dinamikbağlama) denenbirtekniklebaşarılır. www.javaturk.org 29 ca de m y Operation veMethod Ayırımı- I t.a Ø Önceoperation (message)vemethod arasındakiayırımı açıklayalım. Ø Buayırımnesne-merkezlidillerdesözkonusudur. so f Ø Operation (yadamessage)ilesoyutolarakyaniarayüz w w .s el seviyesindebirreferansınüzerindeçağrılabilecekolan davranışlarkastedilir. Ø Method isebirnesneninüzerindeçağrılandavranışın kendisidir. w Ø Operation arayüz,metotisegerçekleştirmedemektir. www.javaturk.org 30 ca de m y Operation veMethod Ayırımı- II t.a Ø Operation (yadamessage)dahaçokbirkalıtımhiyerarşisinde birdenfazlagerçekleştirmesiolanvehiyerarşininentepesinde tanımlananmetodunarayüzünü,metotiseohiyerarşideki gerçekleştirmeleritemsileder. el so f Ø Birhiyerarşidebiroperation amaooperationun birdenfazla gerçekleştirmesiyanimetodubulunur. w w w .s Ø Operation dahaçoktasarımvederlemezamanı,method ise derlemeveçalışmazamanıyapısıdır. www.javaturk.org 31 y ca de m DinamikBağlama- I Ø Dinamikbağlamadaherşeyçalışmazamanıtarafından belirlenir. Örneğin,isim,parametresayıvetipkontrolleri,dönüştipikontrolü vs. w w Ø w .s el so f t.a Ø Dinamikbağlamada,derleyicisadeceçağrılanmetodun arayüzüyanioperation seviyesindekontrolleryapabilir. Ø Metodunarayüzü,üzerindeçağrıyapılanreferansıntipinde varmı? Ø Metodunarayüzüileçağrısıarasındabiruyumsuzlukvarmı? www.javaturk.org 32 y ca de m DinamikBağlama- II t.a Ø Amaderleyicioperationun gerçektehanginesneüzerindeki gerçekleştirmesininçağrılacağınıbilemez. Ø Çünkünesnebirçalışma-zamanıyapısıdır. el so f Ø Bubilgi,çalışmazamanındaüzerindemetotçağrısıyapılan referansıngösterdiğinesneningerçektipiortayaçıkana kadarbilinemez. w w w .s Ø Nezamannesnebelliolur,ozamanonesneninüzerindeki metodunçağrılacağıbelliolur. Ø Buyüzdenbutürbağlamayalate binding (geçbağlama) denir. www.javaturk.org 33 ca de m y Uygulama- I t.a Ø Shape sınıfınınentepedeolduğubirhiyerarşidüşünün. Ø Shape‘in üzerindedraw(), erase(),calculateArea() ve calculateCircumference()metotlarıvardır. w .s el so f Ø Circle,Rectangle, Square veTriangle iseShape’in alt sınıflarıdırvebumetotlarıoverrideederler. Ø Metotlarıoverrideederkenmümkünse“super”i kullanın. w w Ø Canvas diyebirbaşkasınıfoluşturunveüzerineShape alan, drawShape(Shape s) veeraseShape(Shape s) metotlarını koyun. www.javaturk.org 34 ca de m y Uygulama- II t.a Ø ShapeFactory isimlibirbaşkasınıfınüzerindeki createShape()isimlimetodundarandom olarakbirShape nesnesiyaratıpdöndürmesinisağlayın. w w w .s el so f Ø Testsınıfındadarandom Shape nesneleriüretip,Canvas’ın metotlarınageçinvehangimetotlarınçağrıldığınıgözleyin. www.javaturk.org 35 ca de m y StatikBağlama t.a Ø Statikbağlamadaherşeyçalışmazamanındanönce belirlenirveprogramınçalışmasısırasındadadeğişmez. Ø Muhtemelenderleyicitarafındanbelirlenir. el so f Ø Statikbağlananmetotlarise,bellektekikodlarınaderleyici tarafındanderlemezamanındabağlanır. w .s Ø Buyüzdenbutürbağlanmayaearly binding (erken bağlama)dadenir. w w Ø Genelolarakprosedürel dillerdekimetotlarınbağlanmaları statiktir. www.javaturk.org 36 ca de m y Java’daMetotlarıStatikBağlama- I Buyüzdenoverrideedilemezler, polymorphicdeğildirlerve bağlanmalarıdastatiktir. so f Ø t.a Ø Java’dastatic,private veyafinal olanmetotlarstatikolarak bağlanırlar. Ø static metotlar,nesneüzerindeçağrılmazlar,sınıfüzerinde çağrılırlar. Ø private metotlarzatendevralınmadığındanoverrideda w .s el edilemezlervebağlanmalarıstatiktir. Ø final metotlardevralınırlaramaoverrideedilemezlerve bağlanmalarıstatiktir. w w Ø Java’dasadeceoverrideedilenoperationların birdenfazla metoduolacağından,dinamikbağlanmalarısözkonusudur. www.javaturk.org 37 w w w .s el so f t.a Ø Test.java inbinding package. ca de m y Test.java www.javaturk.org 38 ca de m y Java’daMetotlarıStatikBağlama- II Ø Java’dastatic,private veyafinal olanmetotlarstatikolarak bağlanırlar. w .s el so f t.a Ø Statikbağlananmetotlar,dinamikbağlananmetotlaragöre dahahızlıçalışmaeğilimindedirler. Ø Çünküstatikbağlamaçalışmazamanındayapılacakişleri derlemezamanınaçeker. w w Ø Bundandolayı,overrideedilmeyenmetotları“final”olarak işaretleyerekçalışmazamanıperformansınıarttıranaraçlar vardır. www.javaturk.org 39 ca de m y BindingTest.java so f t.a Ø KullandığınızIDE’nin yardımıyla,BindingTest.java’nın main metodundayapılan“e.work()”ve“boss.youWorkToo()“ metodlarının “implementation”larını bulun. Ø Eclipse’te fareilemetodunüstünegelipCTRL(Win)yada CMD(Mac)tuşlarınabasıp“OpenImplementation”u seçin. Ø Hangimetodunstatik– dinamikbağlandığınıbelirleyin. w .s el public class BindingTest { public static void main(String[] args) { HR hr = new HR(); Employee e = hr.getAnEmployee(); e.work(); w w Boss boss = new Boss(); boss.youWorkToo(); } } www.javaturk.org 40 ca de m y Java’daMetotlarıStatikBağlama- III Ø Java’dastatic olanmetotlarstatikolarakbağlanırlar. w w w .s el so f t.a Ø Eğer,ebeveyndeolanstatikbirmetodualtsınıftatekrar tanımlarsanızbuoverriding olmaz. Ø Bunagölgeleme (shadowing)denir. Ø Yani,altsınıftakimetot,ebeveyndendevralınanmetodu gölgeler. www.javaturk.org 41 y ca de m DeğişkenBağlama Ø Java’danesnevesınıfdeğişkenleridenesnelerestatik olarakbağlanırlar. so f t.a Ø Overriding,sadecenesnemetotlarıiçingeçerlidir, değişkenleriçinsözkonusudeğildir. w w w .s el Ø Eğer,ebeveyndeolanbirdeğişkeni(nesneyadastatik olsun)altsınıftatekrartanımlarsanızbuoverriding olmaz, gölgeleme (shadowing)olur. www.javaturk.org 42 y ca de m t.a w w w .s el so f Sonuçlar www.javaturk.org 43 y ca de m NedenPolymorphism? so f t.a Ø Polymorphism,programlarınparçalarıarasındaki bağımlılıklarıarayüzseviyesineçekerekdahakolay değiştirebilmeimkanısağlar. Ø Polymorphismsayesindearayüzilegerçekleştirmeyi ayırabiliriz. el Programto aninterfacenotanimplementation. w w .s Ø Varolanhiyerarşiyeyapılacakdeğişiklikler,ohiyerarşiyien tepedekisınıf(yaniarayüz)düzeyindebilenistemcisınıfları etkilemez. w Ø Bupolymorphismin entemelartısıdır. www.javaturk.org 44 ca de m y Polymorphismin BirSonucu- I t.a Ø Polymorphismin negatiftarafıise,bahsedilenentemel artısınınbirsonucudur. Ø Polymorphismde altsınıflarınkendilerinehasözelliklerini kullanamayız. w .s el so f Ø Çünküpolymorphism,birhiyerarşidekinesneleri, hiyerarşininentepesindekinesnecinsindenifade ettiğinden,altsınıflarınnesneleridetepesınıfınnesnesi olarakgörülür. w w Ø Bukalıtımınsağladığıgenelleştirme- özelleştirmeilişkisi üzerinebinaedilenpolymorphicdavranışınbirsonucudur. www.javaturk.org 45 ca de m y Polymorphismin BirSonucu- II so f t.a Ø Birmetodunarayüzü,ometodunkendisiüzerindeçağrıldığı referansıntipitarafındanbelirlenir. Ø BundandolayıEmployee tipindekireferansınüzerindesadece Employee’nin arayüzündeki metotlarçağrılabilir. Ø Ometodunhangigerçekleştirmesininalınacağıise referansıngösterdiğinesnetarafındanbelirlenir. w w w .s el Employee e = new Employee(); e.work(); e = new Manager(); e.work(); e.manage(); => Derleme hatası e = new Director(); e.work(); e.makeAStrategicPlan() => Derleme hatası www.javaturk.org 46 y ca de m t.a w w w .s el so f Downcasting (Alçaltma) www.javaturk.org 47 y ca de m el so f t.a Ø Birreferansıyadanesneyialıponu üsttipindenbirreferansaatamaya upcasting (yükseltme)denir. Ø Upcasting,yerinegeçebilme özelliğindendolayıherzaman güvenlidir. Ø Dolayısıylacastoperatörü“()” kullanmayagerekyoktur. w w w .s Manager m = new Manager(); Employee e = m; ya da doğrudan Employee e = new Manager(); Manager m = new Director(); Emlpoyee e = new Director(); Referans Upcasting Upcasting (Tekrar) www.javaturk.org Nesne/Referans 48 ca de m y Downcasting - I t.a Ø Peki,üstbirtiptenolanbirreferansıyadanesneyi,alt tiplerindenolanbirreferansaatayabilirmiyiz? Ø Vebuneişeyarar? w w w .s el so f Ø Üsttiptenolanbirreferansıyadanesneyialıponualt tipindenbirreferansaatamayadowncasting (alçaltma) denir. www.javaturk.org 49 ca de m y Downcasting - II w .s el so f t.a Ø Java,üsttiptenolanbirreferansıya danesneyialıponualttipindenbir referansaatamayaizinvermez, derlemehatasıverir. Ø Butürdenatamayayanidowncastinge ancakcast operatörü “()”ileizinverir. Ø Castoperatörüiçindehedeftip bulunur. Downcasting Nesne ya da Referans w w Employee e = new Employee(); Manager m = e; // Derleyici hatası Manager m = (Manager) e; // Problem! m.manage(); Director d = (Director)new Manager(); Director d = (Director)new Employee(); www.javaturk.org Referans 50 y ca de m Downcasting - III el so f t.a Ø Castoperatörükullanarakçevrimezorlamak,derleyici hatasınıgideriramaçalışmazamanındahalagerçek nesneninçevrilentipeuygunolmamamariskivardır. Ø Eğercastedilennesneyadareferansıngösterdiğinesne, hedeftiptenyadaonunalttipindendeğilse,budurumda çalışmazamanındajava.lang.ClassCastException sıradışı durumuoluşur. w .s Employee e = new Manager(); Manager m = (Manager) e; // Gerçek tipe geri dönüş w w Employee e = new Employee(); Manager m = (Manager) e; // ClassCastException! Director d = (Director) new Manager(); // ClassCastException! Director d = (Director) new Employee();// ClassCastException! www.javaturk.org 51 y w w w .s el so f t.a ca de m DowncastingExample.java www.javaturk.org 52 y ca de m Downcasting - IV el so f t.a Ø Downcast işlemineçoğunlukla,üsttiptenbirreferans döndürenmetotçağrılarındansonraihtiyaçduyulur. Ø Castoperatörükullanarakçevrimyaparken,çevriminuygun birtipeyapılmamasıihtimalindendolayıClassCastException sıradışıdurumufırlatılabilir. w .s HR hr = new HR(); Employee e = hr.getAnEmployee(); // Exact type of the returned object is not known! w w Director d = (Director) e; // Risk of ClassCastException! d.makeAStrategicPlan(); www.javaturk.org 53 y ca de m ClassCastException w w w .s el so f t.a Ø ClassCastException,java.lang paketindekisıradışıdurum sınıflarındanbirisidir. Ø Birnesne,nesnesiolmadığı,kenditipininalttiplerinden birineçevrilmeyeçalışıldığındafırlatılır. www.javaturk.org 54 y ca de m instanceof Operatörü el so f t.a Ø Castoperatörükullanarakçevrimyaparken,çevriminuygun birtipeyapılmamasındandoğacakClassCastException sıra dışıdurumunuönlemeninyöntemi,instanceof operatörüdür. Ø instanceof operatörüsağavesolabirertaneolmaküzereiki taneoperand alırveboolean döndürür: Ø Soldakitestedilecekreferans,sağdakiisehedeftiptir. w w w .s Employee e = new Employee(); if(e instanceof Manager){ Manager m = (Manager) e; } Director d = (Director)new Manager(); Director d = (Director)new Employee(); www.javaturk.org 55 y w w w .s el so f t.a ca de m InstanceofExample.java www.javaturk.org 56 ca de m y Upcasting vs.Downcasting - I Ø Upcasting,tümnesneleri,ebeveynleritipindengörmemizi veonlarasankiebeveynmişgibidavranmamızısağlar. so f t.a Ø Upcastingin negatiftarafıise,üsttiplerdenreferanslarla gösterilennesnelerin,ebeveynlerindeolmayan,kendilerine hasolanözelliklerinikaybetmeleridir. w w w .s el Ø Çünkübirnesneninüzerindeerişilebilecekolanözellikleri,o nesneninreferansınıntipibelirler. Ø Referansüsttiptenolduğuiçinreferansınarayüzü,gerçek nesneninarayüzünden dahadardır(extends anahtar kelimesi!) www.javaturk.org 57 ca de m y Upcasting vs.Downcasting - II w w w .s el so f t.a Ø Dolayısıylaupcasting,nesneleritektipleştirir,farklılıklarını ortadankaldırır. Ø Farklıözellikleresahipolannesneler,aynıreferansa atandığında,arayüzleriaynileşir vereferansınarayüzüne iner. Ø Downcasting isebuşekildekendinehasolanözelliklerini, üsttiptenreferansaatanmasındandolayıkaybetmişolan nesnelere,varolanözelliklerinigerikazandırır. Ø Upcasting iletektipleşmişolannesneler,downcasting ile tabiricaizsekendilerinegelirler,tümözelliklerini gösterebilirler. www.javaturk.org 58 y ca de m TestPayrollOffice.java w w w .s el so f t.a Ø TestPayrollOffice.java’yı çalıştırmadanönce PayrollOfice.java’daki paySalary(Employee e)metodunu değiştirin. www.javaturk.org 59 ca de m y Özet t.a Ø Bubölümde,çokşekillilik (polymorphism)elealındır. Ø Referanslarvemetotlarınpolymorphic davranışlarıincelendi. so f Ø Tiplerarasındakiupcasting vedowncasting çevrimleri (conversion)elealındı. w w w .s el Ø instanceof operatörüileRunTime Type Identification (RTTI) işlendi. www.selsoft.academy 60 y ca de m t.a w w w .s el so f Ödevler www.selsoft.academy 61 ca de m y Ödevler I Ø DahaönceoluşturduğunuzShape hiyerarşisinielealın. w w w .s el so f t.a Ø Canvas sınıfınınüzerindevarolandrawShape() veeraseShape() metotlarındaçizilenyadasilinennesneningerçektipinegöre yarıçapını,kenarlarınıveyüksekliğinikonsolayazın. www.javaturk.org 62 ca de m y Ödevler II w w w .s el so f Ø Upcasting ve downcasting ile instanceof kullanacak şekilde RegistrationOffice metotlarınıkurgulayın. t.a Ø Yandakiyapıyıoluşturun. www.javaturk.org 63