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