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

Benzer belgeler