1 / 38

Pol i mor f i z m

Pol i mor f i z m. Pol i mor fiz m. 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.

heavynne
Télécharger la présentation

Pol i mor f i z m

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Polimorfizm

  2. 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, 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ğrumakeNoise( ) 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. Polimorfizm 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 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. Polimorfizm • 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 instanceofile 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( ); • }

  9. Dönüşüm(Casting) … Neden? “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 ?” • 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. Dönüşüm(Casting) …Neden? Cevap:derleme zamanı (compile-time)veçalışma zamanı (run-time)tür kontrolleri arasındaki farktan kaynaklanmaktadır. Kaynak Kod Derleme Bytekod JVMYorumlayıcı Programçalışma hatalar hatalar • Ç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[<badIndex>] = someAnimal • İfade kurallara uygun, fakat çalışma zamanında belirtilen badIndex hata verir (dizinin boyutunu aştığı için). • 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.

  11. 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 polimorfikbelirsizliklerin aydınlatılması.

  12. Nesneler nasıl oluşturulur Object Object Object Animal Animal Animal Dog Dog Dog d d d Dog d = new Dog(); 1. 2. 3. Çalışma Zamanı Ü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 Dogis-a Animal, && is-a Object)

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

  14. Dinamik bağlama (dynamic Binding) o Object Animal Dog a 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) .toString() .toString() .toString() System.out.println (o.toString()); Dinamik bağlama çalışma zamanında mümkün olan en özel implemantasyona göre çözümlememe sağlar.

  15. Casting ve Polimorfizm Hayır Metot o Object Animal .doYourThing() Dog .doYourThing() a 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). 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.

  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. Not: abstact sınıflara ait nesneler oluşturulamaz !!! abstract class animal { abstract void makeNoise(); } abstract class fourLegged { } class chicken { void makeNoise() { // Kod buraya! } } class Dog { void makeNoise() { // Kod buraya! } }

  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. Animal Pet İki ana sınıf, Bir çocuk sınıf Dog • Ç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. • Java çoklu kalıtımla aynı işleve sahip bir yapı sağlamaktadır: Interface (Arayüz)

  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 = 3.141592; } • Ş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 = 3.141592; } • We use like this: class Box implements Constants { ... feet = miles * FEETPERMILE;

  35. Sorular?

  36. Görünürlük and Erişim Herhangi bir nesne, her alana ulaşabilir ve her metodu çağırabilir mi? Görünürlük Değiştiricisi: Erişebilir: public protected private Tüm sınıflarEvetHayırHayır Bir alt sınıfEvetEvetHayır Sınıfın bir nesnesiEvet EvetEvet 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

  37. Görünürlükve Erişim Herhangi bir nesne, her alana ulaşabilir ve her metodu çağırabilir mi?

  38. Sorular?

More Related