Java`da Soyutlama (“Abstraction”) ve Çok-biçimlilik
Transkript
Java`da Soyutlama (“Abstraction”) ve Çok-biçimlilik
Java’da
Soyutlama (“Abstraction”)
ve
Çok-biçimlilik (“Polymorphism”)
BBS-515 Nesneye Yönelik Programlama
Ders #9 (16 Aralık 2009)
İçerik
ç
Geçen ders:
Java Applet’lerde bileşen yerleştirme türleri (“applet layouts”)
Java’da “Awt” ve “Swing” kütüphane bileşenleri
Örnekler
Ö
Bu ders:
Soyutlama (“abstraction”)
Arayüz (“Interface”) tanımlama
Çok-biçimlilik (“polymorphism”)
Örnekler
A.Tarhan, 2009
-2-
BBS-515-DN09 / 2
Soyutlama (“Abstraction”)
Soyut
y ((“Abstract”)) Sınıf
Alt sınıfların ortak özelliklerini ve işlevlerini taşıyan bir üst sınıf oluşturmak
istersek ve gerçek dünyada bu sınıftan bir nesne yoksa,
yoksa üst sınıfı “soyut
soyut
sınıf” olarak tanımlarız.
Örnek: “Memeli” sınıfından direkt bir nesne oluşturulmaz; ancak alt sınıfları
tanımlanarak onlardan nesneler oluşturulur.
S
Soyut sınıfın
f yöntemlerini, alt-sınıfları
f
tarafından
f
üzerine yazılmak üzere,
sadece şablon olarak tanımlayıp içlerini boş bırakabiliriz veya soyut
yöntem (“abstract method”) olarak tanımlayabiliriz.
Çağıran sınıflar için arayüz oluşturur.
Alt sınıflar üzerine yazarak işlevlerini tanımlar.
A.Tarhan, 2009
-4-
BBS-515-DN09 / 4
UML’de Soyut (“Abstract”) Sınıf
Gerçekte nesnesi olmayan bir sınıf, kalıtım ağacında “abstract” (soyut)
olarak tanımlanır
tanımlanır.
Sınıf ismi yatık (“italic”) yazılır
Yeniden kullanma (“reuse”) amaçlı
Üzerine
Ü
yazma için şablon
Şekil
merkez
taşı()
büyüt()
göster()
“Abstract”
(soyut)
sınıf
A.Tarhan, 2009
Dikdö t
Dikdörtgen
Ç b
Çember
köşe
yarıçap
-5-
Çokgen
noktalar
göster()
BBS-515-DN09 / 5
Soyutlama
y
((“Abstraction):
) Örnek – 1
public abstract class Sekil {
Somut
yöntemler
(“concrete
methods”))
methods
Sekil
public int cevre() {
// üzerine yazılacak
return 0;
}
cevre()
alan()
Dikdortgen
boy : int
en : int
public int alan() {
// üzerine
ü i yazılacak
l
k
return 0;
}
}
VEYA ;
EsUcgen
kenar : int
yukseklik : int
Cember
yyaricap
p : int
public abstract class Sekil {
Soyut
yöntemler
(“abstract
methods”)
public abstract int cevre();
public abstract int alan();
}
A.Tarhan, 2009
-6-
BBS-515-DN09 / 6
Soyutlama
y
((“Abstraction):
) Örnek – 1 ((devam))
public class Dikdortgen extends Sekil {
private int boy;
private int en;
public int cevre() {
return (2 * (boy + en));
}
Sekil
cevre()
alan()
public int alan() {
return (boy * en);
}
Dikdortgen
do ge
boy : int
en : int
}
A.Tarhan, 2009
-7-
Cember
yaricap : int
EsUcgen
kenar : int
yukseklik : int
BBS-515-DN09 / 7
Soyutlama
y
((“Abstraction):
) Örnek – 1 ((devam))
public class Cember extends Sekil {
private int yaricap;
public int cevre() {
return (2 * 3 * yaricap);
}
public int alan() {
Sekil
return ( 3 * yaricap * yaricap);
cevre()
alan()
}
}
Dikdortgen
boy : int
en : int
A.Tarhan, 2009
-8-
Cember
yaricap : int
EsUcgen
kenar : int
yukseklik : int
BBS-515-DN09 / 8
Soyutlama
y
((“Abstraction):
) Örnek – 1 ((devam))
public class EsUcgen extends Sekil {
private int kenar;
private int yukseklik;
public int cevre() {
return (kenar * 3);
}
Sekil
public int alan() {
cevre()
alan()
return ((kenar * yukseklik) / 2);
}
}
A.Tarhan, 2009
Dikdortgen
boy : int
en : int
-9-
Cember
yaricap : int
EsUcgen
kenar : int
yukseklik : int
BBS-515-DN09 / 9
Soyut
y Sınıf ve Yöntemlerin Kullanımı
Soyut sınıflardan nesne oluşturulamaz.
Soyut yönteme sahip bir sınıfın kendisi de otomatik olarak soyuttur ve öyle
tanımlanmak zorundadır.
Bir soyut sınıfın alt sınıfları, ancak üst sınıfın tanımladığı soyut sınıfların üzerine
yazdığı ve onlara birer işlev tanımladığı zaman örneklenebilir (“instantiation”).
Bu durumda alt sınıflar somut sınıf ((“concrete
concrete class
class”)) olarak adlandırılır
adlandırılır.
Bir soyu sınıf, soyut yöntemlere ek olarak, somut yöntemler de tanımlayabilir.
Bir soyut sınıf sadece somut yöntemleri de içerebilir.
içerebilir
Eğer bir soyut sınıfın alt sınıfı, o sınıfa ait tüm soyut yöntemleri gerçekleştirmezse;
alt sınıf da soyut tanımlanmak zorundadır
zorundadır.
static, final ve private olarak tanımlı yöntemler, üzerine yazılamadıklarından,
soyut o
olarak
a a ta
tanımlanamazlar.
a a a a
A.Tarhan, 2009
- 10 -
BBS-515-DN09 / 10
Soyutlama
y
((“Abstraction):
) Örnek - 2
abstract class A {
abstract void beniCagir ();
void benideCagir () {
System.out.println (“A’nın somut metodu.”);
}
}
class B extends A {
void beniCagir() {
System.out.println (“B’nin beniCagir metodu.”);
}
}
Çıktı:
B’nin beniCagir metodu.
A’nın benideCagir somut metodu.
class SoyutDemo {
public static void main (String args [] ) {
B b = new B ();
b.beniCagir ();
b.benideCagir (); // Somut (“concrete”) yöntemler de miras alınarak kullanılabilir.
}
}
A.Tarhan, 2009
- 11 -
BBS-515-DN09 / 11
Arayüz (“Interface”)
Arayüz
y ((“Interface”))
Java’da çoklu kalıtıma (“multiple inheritance”) izin verilmez. Bunu telafi
etmek için arayüz (“interface”)
( interface ) kavramı tanımlanmıştır
tanımlanmıştır.
Bir sınıfın bir üst-sınıfı olabilir ve birden çok arayüzü gerçekleştirebilir.
Arayüzler soyuttur ve doğrudan örneklenemez.
Arayüz tanımı sınıfa benzer; ancak sadece yöntem imzalarını (“method
signatures”) ve sabit değişkenler (“constant variables”) içerebilir.
Bir arayüzü gerçekleştiren her sınıf, arayüz içinde imzası tanımlanmış
yöntemlerin kodlarını yazmak zorundadır (yöntem imzaları aynı olmalıdır.)
Tüm yöntemlerin kodunu yazmıyorsa sınıf, soyut tanımlanmış olmalıdır.
Tüm yöntemleri yazmıyor ve soyut tanımlanmadı ise derleyici hata verir
verir.
A.Tarhan, 2009
- 13 -
BBS-515-DN09 / 13
Arayüz
y ((“Interface”):
) Örnek - 1
public class Bisiklet {
int vitesSayisi;
public Bisiklet (int v) {
vitesSayisi = v;
}
public void print () {
System.out.println ((“Bu
Bu bisikletin “ + vitesSayisi + “ vitesi var.”);
var. );
}
}
public interface Arac {
public void print ();
}
A.Tarhan, 2009
Ekrana bisiklet
çizdirmek istediğimizi
varsayalım.
(Bunun için
java.awt.Canvas sınıfını
k ll
kullanmalıyız;
l
ancakk çoklu
kl
kalıtım yapamayız.)
public class Bisiklet extends Canvas implements Arac {
int vitesSayisi;
public Bisiklet (int v) {
vitesSayisi = v;
}
public void print () {
System.out.println ((“Bu
Bu bisikletin “ + vitesSayisi + “ vitesi var.
var.”);
);
}
public void paint () {
// bisikleti çizecek kod
}
}
- 14 -
BBS-515-DN09 / 14
Arayüz
y ((“Interface”):
) Örnek – 2
Aşağıdaki “EsUcgen” sınıfından oluşturulan nesnelerin şekil
değiştirebileceğini varsayalım
varsayalım. Ancak bu yetenek tüm şekillere değil
değil,
sadece “EsUcgen” sınıfına özgü olsun.
Sekil
cevre()
()
alan()
Dikdortgen
boy : int
en : int
i t
EsUcgen
E
U
kenar : int
yukseklik : int
pozX : int
pozY : int
Cevre
yaricap : int
<<Interface>>
FizikselDegisim
hareket()
hareket()
A.Tarhan, 2009
- 15 -
BBS-515-DN09 / 15
Arayüz
y ((“Interface”):
) Örnek – 2 ((devam))
public interface FizikselDegisim {
public void hareket();
}
public class EsUcgen extends Sekil implements FizikselDegisim {
private
i t int
i t kenar;
k
private int yukseklik;
private int pozX;
private int pozY;
public void hareket() {
int x,y;
System.in.read(x);
System.in.read(y);
pozX = x;
pozY
Y = y;
}
}
Sekil
cevre()
alan()
EsUcgen
kenar : int
Dikdortgen
Cevre
boy : int
yaricap : int
en : int
yukseklik : int
<<Interface>>
FizikselDegisim
pozX : int
pozY : int
hareket()
hareket()
A.Tarhan, 2009
- 16 -
BBS-515-DN09 / 16
Arayüz
y ((“Interface”):
) Örnek - 3
java.awt.event.
ActionListener.java
A.Tarhan, 2009
- 17 -
BBS-515-DN09 / 17
Çok Biçimlilik (“Polymorphism”)
( Polymorphism )
Ç
Çok-Biçimlilik
ç
Bir kalıtım ağacına ait sınıflarda aynı imza (dönüş tipi, ad, parametreler)
ile tanımlanmış bir yöntem var ise; Java ortamı çalıştırma zamanında
yöntemin hangi sınıfa ait tanımdan çalıştıracağını dinamik olarak
belirleyebilir. Bu özelliğe çok-biçimlilik (“polymorphism”) denir.
Bu özellik,, “if” veya
y “switch”
kullanımına gerek bırakmaz.
Calisan
Ca
sa
maasHesapla()
Sekreter
Yonetici
maasHesapla()
maasHesapla()
A.Tarhan, 2009
Yeni bir işçi alt sınıfı
eklendiğinde mevcut kodun
değiştirilmesi gerekmez.
- 19 -
BBS-515-DN09 / 19
Çok-Biçimlilik
Ç
ç
((“Polymorphism”):
y
p
) Örnek – 1
interface Konus {
S
String
getAd();
()
String merhaba ();
}
abstract class Insan implements Konus {
private final String
p
g ad;;
protected Insan (String pAd) {
this.ad = pAd;
}
public String getAd() {
return this.ad;
}
}
A.Tarhan, 2009
- 20 -
BBS-515-DN09 / 20
Çok-Biçimlilik (“Polymorphism”):
Örnek – 1 (devam)
(
)
class Turk extends Insan {
public Turk (String pAd) {
super(pAd);
}
public
bli String
St i
merhaba
h b () {
return “Merhaba!";
}
}
class Ingiliz extends Insan {
public Ingiliz (String pAd) {
super(pAd);
}
p blic String merhaba () {
public
return “Hello!";
}
}
A.Tarhan, 2009
- 21 -
BBS-515-DN09 / 21
Çok-Biçimlilik (“Polymorphism”):
Örnek – 1 (devam)
(
)
public class Test {
public static void main(String[] args) {
Insan[] insanlar = { new Turk(“Ahmet"),
new Ingiliz (“Marry"),
new Turk (“Ayşe")
};
for (Insan n : insanlar) {
System.out.println(n.getAd() + ": " + n.merhaba());
}
}
}
A.Tarhan, 2009
- 22 -
BBS-515-DN09 / 22
Çok-Biçimlilik
Ç
ç
((“Polymorphism”):
y
p
) Örnek - 2
Çalışan.java
Maasli.java
Saatli.java
PolyDemo.java
PolyDemo java
A.Tarhan, 2009
- 23 -
BBS-515-DN09 / 23