polimorfizm - td software€¢ eski yunanca bir sözcük olup "bir çok şekil" anlamına...
TRANSCRIPT
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 1
Polimorfizm
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 2
Polimorfizm
• Polimorfizm, nesneye yönelikprogramlamanı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 3
Örnek
PolimorfizmOrnekBir.java
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 4
Asker
Er Yuzbasi
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 5
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 6
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 7
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 8
java PolimorfizmIki
Kartal avYakalaHayvan avYakalaKartal avYakala
java PolimorfizmIki
Timsah avYakalaTimsah avYakalaHayvan avYakala
java PolimorfizmIki
Timsah avYakalaHayvan avYakalaKartal avYakala
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 9
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 10
final ve Geç bağlama
• final özelliğinin kullanılmasının ikisebebi olabilir.– tasarım .– verimlilik .
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 11
Cevap
• Uygulama içerisinde herhangi bir nesneye ait normal biryordam (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ç varmı kontrolü yapılır.
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 12
Örnek
KediKaplan.java (on)
KediKaplan2.java (off)
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 13
Neden Polimorfizm ?
• Polimorfizm olmasaydı neler olurdu ?
IsYeriNon.java
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 14
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 15
Neden Polimorfizm ?
• IsYeriNon.java örneğimizi nesneye yönelikprogramlama çerçevesinde tekrar yazarsak :
IsYeri.java
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 16
Nesnelerden oluşan bir dizi
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 17
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 18
Sınıf hiyerarşisi – IsYeri.java
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 19
Sınıf hiyerarşisi – BuyukIsYeri.java
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 20
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 21
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 22
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 23
Örnek
BuyukIsyeri.java
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 24
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 25
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 26
abstract void calis(); // gövdesi olmayan soyut yordam
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 27
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 28
Örnek
AbIsYeri.java
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 29
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ıniçerisinde tanımlanmalıdır.
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 30
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 31
Örnek
CizimProgrami.java
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 32
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 33
Ekran Çıktısı
calis() cagrilmadan evvelFutbolcu calis() 0 dikkatcalis() cagrildiktan sonraFutbolcu yapilandiriciFutbolcu calis() 4
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 34
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 35
Örnek
Televizyon.java
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 36
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 37
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 38
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 39
Sorular ...