Polimorfizm © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 1 Polimorfizm • Polimorfizm, nesneye yönelik programlamanın (OOP) önemli özelliklerinden biridir. • Eski Yunanca bir sözcük olup "bir çok şekil" anlamına gelmektedir . • Polimorfizm ile kalıtım konusu iç içedir. © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 2 Örnek PolimorfizmOrnekBir.java © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 3 Asker Er © Altuğ B. Altıntaş 2003 Yuzbasi Java ve Yazılım Tasarımı - Bölüm 6 4 Polimorfizm • Asker a = new Asker() ; • Asker a = new Er(); • Asker a = new Yuzbasi(); © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 5 Geç bağlama (late binding) - I • Polimorfizm olmadan geç bağlama özelliğinden bahsedilemez. PolimorfizmOrnekIki.java © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 6 © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 7 java PolimorfizmIki Kartal avYakala Hayvan avYakala Kartal avYakala java PolimorfizmIki Timsah avYakala Timsah avYakala Hayvan avYakala java PolimorfizmIki Timsah avYakala Hayvan avYakala Kartal avYakala © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 8 Geç bağlama (late binding) - II • Derleme anında (compile-time) hangi nesneye ait yordamın çağrılacağını bilinemiyorsa buna geç bağlama denir. • Geç bağlamanın diğer isimleri – Dinamik bağlama (Dynamic binding) – Çalışma anında bağlama (Run-time binding) • Bunun tam tersi ise erken bağlamadır (early binding). © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 9 final ve Geç bağlama • final özelliğinin kullanılmasının iki sebebi olabilir. – tasarım . – verimlilik . © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 10 Cevap • Uygulama içerisinde herhangi bir nesneye ait normal bir yordam (final olmayan) çağrıldığında : – Java, acaba doğru nesnenin uygun yordamı mı çağrılıyor diye bir kontrol yapar. • Daha doğrusu geç bağlamaya (late-binding) ihtiyaç var mı kontrolü yapılır. © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 11 Örnek KediKaplan.java (on) KediKaplan2.java (off) © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 12 Neden Polimorfizm ? • Polimorfizm olmasaydı neler olurdu ? IsYeriNon.java © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 13 © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 14 Neden Polimorfizm ? • IsYeriNon.java örneğimizi nesneye yönelik programlama çerçevesinde tekrar yazarsak : IsYeri.java © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 15 Nesnelerden oluşan bir dizi © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 16 Genişletilebilirlik (Extensibility) • Genişletilebilirlik, mevcut kalıtımsal hiyerarşiyi genişletmektir. • Polimorfizm özelliği sayesinde genişletebilirlik çok basite indirgenmiş bulunmaktadır . © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 17 Sınıf hiyerarşisi – IsYeri.java © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 18 Sınıf hiyerarşisi – BuyukIsYeri.java © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 19 Genişletilebilirlik (Extensibility)-2 • Polimorfizm sayesinde, mevcut hiyerarşik yapı ne kadar genişletilirse genişletilsin, yordam (method) çağırma yapısı hep aynı kalır. BuyukIsyeri.java © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 20 Soyut sınıflar ve Yordamlarlar (Abstract Classes and Methods ) © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 21 © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 22 Örnek BuyukIsyeri.java © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 23 class Calisan { public String pozisyon = "Calisan"; public void calis() {} } © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 24 Soyut Sınıflar (Abstract classes) • Soyut sınıfların içerisinde en az bir tane gövdesiz (soyut) yordam bulunur. • Soyut sınıfları direk new() anahtar kelimesi ile oluşturamayız. © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 25 abstract void calis(); // gövdesi olmayan soyut yordam © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 26 © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 27 Örnek AbIsYeri.java © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 28 Niye soyut sınıf ve yordamlara ihtiyaç duyarız ? • Eğer bir işlem değişik verilere ihtiyaç duyup aynı işi yapıyorsa, bu işlem soyut (abstract) sınıfların içerisinde tanımlanmalıdır. © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 29 © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 30 Örnek CizimProgrami.java © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 31 Yapılandırıcılar içerisindeki ilginç durumlar... Spor.java © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 32 Ekran Çıktısı calis() cagrilmadan evvel Futbolcu calis() 0 Æ dikkat calis() cagrildiktan sonra Futbolcu yapilandirici Futbolcu calis() 4 © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 33 © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 34 Örnek Televizyon.java © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 35 © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 36 Aşağıya Çevirim (Downcasting) • Aşağıya çevirim tehlikelidir. – Daha genel bir tipden daha özellikli bir tipe doğru çevirim vardır. – Yanlış bir çevirim yapıldığında, çalışma anından (run-time) istisna (exception) fırlatılır. Televizyon2.java © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 37 Sınıf tiplerinin çalışma anından tanımlanması (RTTI : Run Time Type Identification) Televizyon3.java © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 38 Sorular ... © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 39