Polimorfizm - TD Software

advertisement
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
Download