Sunum yükleniyor. Lütfen bekleyiniz

Sunum yükleniyor. Lütfen bekleyiniz

Polimorfizm. Bir çok alt sınıf aynı davranışı göstermek için değişik metodlara sahip olabilir. –Eğer siz, bir nesnenin doğru imza ile bir metodu çağrıldığında,

Benzer bir sunumlar


... konulu sunumlar: "Polimorfizm. Bir çok alt sınıf aynı davranışı göstermek için değişik metodlara sahip olabilir. –Eğer siz, bir nesnenin doğru imza ile bir metodu çağrıldığında,"— Sunum transkripti:

1 Polimorfizm

2 Bir çok alt sınıf aynı davranışı göstermek için değişik metodlara sahip olabilir. –Eğer siz, bir nesnenin doğru imza ile bir metodu çağrıldığında, o işi yapabileceğini biliyorsanız, bunu nasıl yaptığı konusundaki detaylarla ilgilenemezsiniz. –Örneğin, bir hayvanat bahçesini ele alalım. Buradaki her tür hayvanın ses çıkardığını düşünün. Ancak, her tür hayvan farklı ses çıkarır.

3 Polimorfizm class Animal { public void makeNoise ( ) { System.out.println (“I am an animal.”); } // of makeNoise } // of Animal class Fish extends Animal { public void makeNoise( ) { System.out.println (“Glug glug gurgle gurgle”); } // of makeNoise } // of Fish class Bird extends Animal { public void makeNoise( ) { System.out.println(“Tweet tweet flap flap”); } // of makeNoise } // of Bird

4 Polimorfizm (devam) class Dog extends Animal { public void makeNoise ( ) { System.out.println(“Sniff sniff woof woof”); } // of makeNoise public void bark ( ) { System.out.println(“Arf Arf”); } // of bark } // of Dog

5 Polimorfizm class Driver { public static void main (String[ ] argv) { Animal[ ] animalArray = new Animal[3]; int iIndex; animalArray[0] = new Bird( ); animalArray[1] = new Dog( ); animalArray[2] = new Fish( ); for (iIndex=0; iIndex < animalArray.length; iIndex++) { animalArray[iIndex].makeNoise( ); } // of for } // of main } // of Driver Output: Tweet tweet flap flap Sniff sniff woof woof Glug glug gurgle gurgle Bütün hayvanlar ses çıkarabilir (makeNoise), öyleyse dizinin bütün elemanları ses çıkarabilir anlamına gelmektedir ( makeNoise)

6 Polimorfizm Polimorfizm “değişik formları(şekilleri) alabilme” anlamına gelmektedir. Bir sınıfa ait nesne, o sınıfın alt sınıflarından birinin şekline bürünebilir. Polimorfizm demek oluyor ki, doğru makeNoise( ) metodu her zaman çağrılacaktır. Bir alt sınıf her zaman için kendisinin süper sınıfına vekalet edebilir, onun yerine kullanılabilir. Örneğin, kuş – hayvan ilişkisi. “Kuş bir hayvandır.” ( “A bird is a animal.” ) Evet. Tersi doğru değildir. Bir süper sınıf, kendisinin alt sınıfına vekalet edemez. Örneğin, Bir hayvan kuşun yerini alamaz. “Bir hayvan kuş mudur?” (“An animal is a bird?”) Hayır, her hayvan bir kuş değildir. Bir çok davranış biçimi için sadece bir tek arayüz : Metod çağırmak için bir tek arayüz. Alt sınıfa bağlı olarak birçok davranış.

7 class Driver2 { public static void main(String[ ] argv) { Animal[ ] = animalArray[3]; Dog d; int iIndex; animalArray[0] = new Bird( ); animalArray[1] = new Dog( ); animalArray[2] = new Fish( ); for ( iIndex =0; iIndex < animalArray.length; iIndex++) if (animalArray[iIndex] instanceof Dog) { d = (Dog) animalArray[iIndex]; d.bark( ); } // if } // main } // Driver2 Polimorfizm bark()metodunu çağırmadan önce cast işlemi(tür dönüşümü) yapıyoruz, çünkü sadece köpekler havlayabilir. Öyleyse bazı dizi üyeleri metodu çağıramaz.

8 Cast işlemi (Casting- Tür dönüşümü): buradaki kullanım amacı, süper sınıfa ait bir nesneye, uygun bir altsınıfın formunu vermektir. Örneğin, if (animalArray[iIndex] instanceof Dog) { animalArray[iIndex].bark(); } Hata oluştururdu, çünkü Animal sınıfının bark diye bir metodu yok. Bu nedenle instanceof ile Dog olduğunu garantilediğimiz şeyi Dog olarak dönüşüm yaptırırız. if (animalArray[iIndex] instanceof Dog) { d = (Dog) animalArray[iIndex] d.bark( ); } Polimorfizm

9 “instanceof” deyimi: Herhangi bir nesnenin belirtilen sınıfa ait olup olmadığını kontrol eder. Örneğin: “Bu hayvan köpek sınıfına mı ait ?” Dönüşüm(Casting) … Neden? Soru: Eğer Java bir hayvanın köpek sınıfına ait olup olmadığını instanceof vasıtasıyla belirleyebiliyorsa, o zaman: Java ’nın, nesnenin havlayıp havlayamayacağını anlamak için tür dönüşümüne ihtiyaç duyması neden? Neden Java kendisi, bunu bizim için yapamıyor?

10 Kaynak Kod Derleme Byte kod JVM Yorumlayıcı Program çalışma hatalar Cevap: derleme zamanı (compile-time) ve çalışma zamanı (run-time) tür kontrolleri arasındaki farktan kaynaklanmaktadır. Dönüşüm(Casting) …Neden? Dönüşüm(Casting) … Neden? Derleme zamanı hataları: Program çalışmadan,daha derleme zamanında ayırt edilen hatalar. Yazılan kod kurallara uygun mudur sorusuna cevap aranır: Örneğin, iIndex = strName; Yukarıdaki ifade legal değildir. Çalışma zamanı hataları: Programın çalışma zamanında, asıl verilerle çalışırken ortaya çıkan, ayırt edilebilen hatalardır. Programın çalışması kurallara uygun mudur sorusuna cevap aranır. Örneğin, programı çalıştırdığımızda klavyeden, int türünden bir değişkene string ifade girmek gibi. animalArray[ ] = someAnimal İfade kurallara uygun, fakat çalışma zamanında belirtilen badIndex hata verir (dizinin boyutunu aştığı için).

11 Dönüşüm(Casting) …Neden? Dönüşüm(Casting) … Neden? if (animalArray[iIndex] instanceof Dog){ animalArray[iIndex].bark(); } if (animalArray[iIndex] instanceof Dog) { d = (Dog) animalArray[iIndex]; d.bark( ); } 1. satır legaldir. Burada görüyoruz ki, 1. satır, 2. satırın legal olmasını garanti etmektedir. Ancak, derleyici bunu, yani ifadeler arasındaki ilişkileri bizim gibi farkedemez... Çalışma zamanlı sistem bunu kolayca söyleyebilir. ANCAK... Performans ve doğrulamanın daha yüksek seviyede olması için hemen hemen bütün kontrolün derleme zamanında olmasını tercih ederiz. Burada, bütün satırların kurallara uygunluğu derleme zamanında değerlendirilebilir. Her satırın kurallara uygunluğu, ifadeler arasındaki ilişkiler konusunda endişelenmeksizin ayırt edilebilir. Her satır kendi başına değerlendirilebilir. Kodun legal olduğundan emin olabilirsiniz. (bazen legal omayabilir). Casting kullanımı için güzel bir örnek: derleyici için polimorfik belirsizliklerin aydınlatılması.

12 Nesneler nasıl oluşturulur Dog d = new Dog(); Üstü kapalı olarak çağırılan super() metodu ana sınıfın yapılandırıcısını çağırır. En sonunda, köpek bir Hayvandır ve bir Nesnedir. (a Dog is-a Animal, && is-a Object) d Animal Dog Object d Animal Dog Object d Animal Dog Object Çalışma Zamanı

13 Polimorfizm... Animal a = new Dog(); Bir bakımdan, casting bir tür polymorphic davranış biçimidir. a Animal Dog Object Animal a = new Dog(); Object o = a; a Animal Dog Object o Aynı hafıza bloğu içerisinde değişik türlere referanslar oluşturabiliriz.

14 Dinamik bağlama (dynamic Binding) a Animal Dog Object o System.out.println (o.toString());.toString() Dinamik bağlama çalışma zamanında mümkün olan en özel implemantasyona göre çözümlememe sağlar. Bir referans üzerinde herhangi bir metodu çağırdığımızda, o metodun türde (ya da türetilen sınıfta) mevcut olması gerekir. Ancak hangisinin çağırılacağına çalışma zamanında karar verilir. İşte bu, dinamik bağlamadır. (dynamic binding)

15 Casting ve Polimorfizm o.doYourThing(); //HATA! Çağıran türün metoda sahip olması gerekir. Ya kendisi sahip olacak ya da üst sınıfından türetme yoluyla gelecek. a Animal Dog Object o.doYourThing() Hayır Metot Dinamik bağlama mucizeler yaratamaz. Referans tipi bu türde bir metoda (ya o sınıf ya da türetilen üst sınıflardan birinde) sahip olmalıdır; olmazsa derleme hatası oluşur(compilation error).

16 Sorular?

17 Soyut Metodlar ve Sınıflar (Abstract Methods & Classes)

18 Soyut sınıf Örneğin, Animal gibi sınıflar, ortak özellikleri barındıran sınıflar olarak tasarlanır. makeNoise() gibi metodlara polimorphik olarak başvuruda bulunmak istiyoruz. Buna rağmen, genel bir hayvanın cinsini bilmeden nasıl ses çıkarttığını bilemeyiz. Aşağıdaki örnekte, anlamsız bir kod örneği var: public void makeNoise ( ) { System.out.println (“I am an animal.”); } // of makeNoise

19 Soyut sınıf Boş bir metod kullanabiliriz: public void makeNoise ( ) { /* Daha sonra tanımlanacak*/ } Bu tabii ki, hiçbir şey yapmaz ve bu metodları işlemek için alt sınıflara bağlıyız. Yazılım mühendisliği aracı olan abstract kavramı ortaya çıkmaktadır. Yukarıdaki metodu abstract olarak tanımlayabiliriz: abstract public void makeNoise(); // Not: Metod gövdesi yok!!! Java daha sonra bizden abstract bir sınıf tanımlamamızı isteyecektir. abstract public class animal...

20 Soyut sınıf abstract sınıfların alt sınıfları aşağıdaki gibi olmalıdır: –eğer üst sınıfın bütün abstract metodlarını tanımlamıyorsa, bu sınıflar abstract olarak tanımlanmalıdır. –Eğer abstract olarak belirtilmiyorsa üst sınıfın bütün abstract metodlarının tanımları mevcut olmalıdır. abstract class animal { abstract void makeNoise(); } abstract class fourLegged { } class Dog { void makeNoise() { // Kod buraya! } } class chicken { void makeNoise() { // Kod buraya! } } Not: abstact sınıflara ait nesneler oluşturulamaz !!!

21 Soyut sınıf Bu tekniği kullanarak, animal sınıfından türeyen bütün alt sınıfların makeNoise metoduna sahip olması garanti edilmiş olur. Bu demek oluyorki, bir nesneyi animal türüne cast ederek makeNoise metodunu çağırabiliriz ve Java buna sorun çıkarmaz. Object o; o = getReferenceFromSomeContainerClass(); ((animal)o).makeNoise();

22 Sorular?

23 Arayüzler (Interfaces)

24 Çoklu kalıtım (Multiple Inheritance) Bazı diller çoklu kalıtıma izin vermektedir. Çoklu kaltım, biçok potansiyel isimlendirme karışıklığını da beraberinde getirir. (örneğin, Pet.doYourThing() ve Animal.doYourThing()) Genelde varılan uzlaşma: çoklu kalıtımın sebep olduğu problemler getirdiği avantajlardan daha fazladır. Java tekli kalıtıma izin verir. Java çoklu kalıtıma izin vermez. Interface (Arayüz) Java çoklu kalıtımla aynı işleve sahip bir yapı sağlamaktadır: Interface (Arayüz) Animal Dog Pet İki ana sınıf, Bir çocuk sınıf

25 Arayüzler (Interfaces) Hiyerarşideki en üst (nihai, parçalara ayrılamayan) abstract sınıf, sabitlerden ve abstract metod prototiplerinden başka bir şey içermez. Bir sınıf, arayüze ait bütün abstract metodlar için bir tanımlama getirdiği takdirde o sınıf arayüzü uygulamaktadır. Arayüzü uygulayan sınıf sanki bir ana sınıftan türemiş gibi davranabilmektedir. Bunun yanında büyük bir avantaja sahiptir ki: –Bütün abstract metodları kendisi tanımladığı için, gizli, türetilen başka bir ana sınıf gibi bir elemanla çarpışmak zorunda kalmıyorsunuz. Bu yüzden, istediğiniz kadar arayüz uygulayabilir, bunu yaparken de çoklu kalıtımda karşılaşın problemlere maruz kalmazsınız.

26 Örnek İçerdiği öğeleri bir sıraya koyabilen bir konteyner (container) sınıfımızın olmasını istiyoruz. İki nesneyi nasıl karşılaştırabiliriz? Bir çeşit tanımlama işlemi yaparız: Düşünün ki, bu konteyner sınıfının içindeki her nesne, diğer nesnelerle karşılaştırılabilmesini sağlayan bir metoda sahip olsun. Peki bunu nasıl şekillendirebiliriz? Arayüz kullanarak

27 Comparable public abstract interface Comparable { abstract int compareTo(Object o); }

28 Farzedin ki... Box nesnelerimizi bir yerde depolamak istiyoruz ve bu amaçla kutularımızı hacimlerine göre karşılatırabilmemiz gerekir. Bu amaçla Box sınıfımızda bir değişikliğe gidiyoruz:

29 Farzedin ki... public class Box implements Comparable {... // Same as before including getVolume method public int compareTo(Object o) { int retval = -1; if(o instanceOf Box) { retVal = getVolume() - ((Box)o).getVolume(); if(retVal == 0) retVal = 0; else if(retVal > 0) retVal = 1; else retval = -1; } return retval; }

30 Programı çalıştırmak... Box a = new Box(10, 20, 30); Box b = new Box(2, 4, 6); Box c = new Box(20, 10, 30); System.out.println(a.compareTo(b)); ===> 1 System.out.println(a.compareTo(c)); ===> 0 System.out.println(b.compareTo(c)); ===> -1 System.out.println(a.compareTo("Hello")); ===> -1;

31 Endişelenmeyin! Birşeyi tanımlarken karşılaştırılabilir (Comparable) olsun demek şu anlama gelir: –tanımladığımız şey bir nesne olmalıdır (ve compareTo metodunu yürütmesi gerekmektedir). –bu metodu sağlaması zorunlu hale gelir.

32 Diğer kullanımı !!! Sabitlerin kullanımında kolaylık sağlayan kurnazca bir yoldur.

33 Sadece sabitler için bir sınıf oluşturabiliriz class Constants { public final static int FEETPERMILE = 5280; public final static String PROMPT = "Enter a number"; public final static double PI = ; } Şu şekilde kullanabiliriz: feet = miles * Constants.FEETPERMILE;

34 Eğer şöyle deseydik... Interface Constants { public final static int FEETPERMILE = 5280; public final static String PROMPT = "Enter a number"; public final static double PI = ; } We use like this: class Box implements Constants {... feet = miles * FEETPERMILE;

35 Sorular?

36 Görünürlük and Erişim Görünürlük Değiştiricisi: Erişebilir: public protected private Tüm sınıflar Evet Hayır Hayır Bir alt sınıf Evet Evet Hayır Sınıfın bir nesnesi Evet Evet Evet Görünürlük değiştiricisini mutlaka belirtin. Kılavuz ilkeler: Sadece sınıfın “yapmayı vaad ettiği” genel işlemleri public yapın Bütün alanları private tanımlayın Diğer bütün “private” metodları protected tanımlayın Paketler hakkında yeterli bilginiz yoksa bu değiştiricileri yazmayı unutmayın Herhangi bir nesne, her alana ulaşabilir ve her metodu çağırabilir mi?

37 Görünürlük ve Erişim Herhangi bir nesne, her alana ulaşabilir ve her metodu çağırabilir mi? PrivateProtectedPublicNone Aynı sınıfın içerisindeEvet Aynı paketin içindeki bir alt sınıf HayırEvet Aynı paketin içinde fakat alt sınıf değil HayırEvet Başka bir paketteki bir alt sınıfHayırEvet Hayır Başka bir pakette ve alt sınıf değil Hayır EvetHayır

38 Sorular?


"Polimorfizm. Bir çok alt sınıf aynı davranışı göstermek için değişik metodlara sahip olabilir. –Eğer siz, bir nesnenin doğru imza ile bir metodu çağrıldığında," indir ppt

Benzer bir sunumlar


Google Reklamları