Polimorfizm.

Slides:



Advertisements
Benzer bir sunumlar
Programlama-II (Java ile Bilgisayar Programlama)
Advertisements

C# - Metotlar.
SCANNER SINIFI ve KLAVYEDEN VERİ OKUNMASI
Tuğba DEMİREL
Zeynep Çelik Sunar….
Programlama-II (Java ile Bilgisayar Programlama)
Nesneye Dayalı Programlama
Polymorphism.  Bir işlem birden fazla tip üzerinde çalışabilir  Metot temel tip arayüzünü kullanır  İşlem çalışan metot tarafından yapılır.
Arayüzler.  Bir classın ne yaptığı nasıl yaptığından daha önemlidir  abstract kelimesi bir classın ne yapacağını belirler  interface tamamı abstract.
Miras Alma EM-406 Java.
EDUTIME Java Day 4 Serdar TÜRKEL.
Sarma (Encapsulation) / Kalitim (Inheritance) /Final Terimleri
P p 8. Ünitede yinelemeli programlamanın teknikleri anlatılmaktadır. p p Gördüğünüz gibi, yinelemeli programlama bir problemin içinde problemin küçük parçalarını.
BPR152 ALGORİTMA VE PROGRAMLAMA - II
PROGRAMLAMA DİLLERİNE GİRİŞ Ders 6: Sınıflar
P AKET E RIŞIMLERI SıNıFLARıN YENIDEN KULLANıMı. P AKET ( P ACKAGE ) Paketler kütüphaneleri oluşturan elemanlardır. import java.io.BufferedReader; BufferedReader.
KOPYA YAPICI FONKSİYON, STATİK ELEMANLAR, ARKADAŞ SINIF VE FONKSİYONLAR, NESNE DİZİLERİ Yılmaz Kılıçaslan.
Sınıfların Tekrardan Kullanılması
Nesne Tabanlı Programlama
Nesneye Yönelik Programlama Dr. Pelin GÖRGEL
NESNEYE YÖNELİK PROGRAMLAMA
DİZİLER.
BPR152 ALGORİTMA VE PROGRAMLAMA - II
DELEGATE OOP-UYG.
Erişim Denetimi, Fonksiyon
NESNE TABANLI PROGRAMLAMA -METOTLAR-
Önemli noktalar Paradigma Nesnelere Giriş Mesajlar / Ara bağlantılar
METODLAR.
C# Metot Overloading (Aşırı yükleme)
Sorular? Öneriler?. Referanslar Referanslar (Tekrar) Eğer aşağıdaki gibi yazarsak ne olur: int x; double y; char c; ???
NESNEYE DAYALI PROGRAMLAMA
Chapter 7: Using Methods. Metotları ve Kodlamayı Gizlemeyi Anlama Metot – Kapsüllenmiş ifadeler serisini gerçekleştiren bir görev – Kullanılan metodun.
C#.NET 5.0 C# .NET 5.0 Eğitimleri Volkan KANAT.
Bilgisayar Programlama
C++ Temelleri C++ genel amaçlı, nesne tabanlı, yüksek seviye programlama dilidir.
Java Sınıf ve Nesne Kavramı UML Gösterimi
Ses Kontrol Metodlar ile ilgili son birkaç söz Tekrar: Programlama için başlıca 3 model.
Metotlar.
FONKSİYONLAR.
METOTLAR.
ÇOK BİÇİMLİLİK POLYMORPHISM
Önceki Dersi Hatırlama !!
Kalıtım.
JAVA’DA DÖNGÜLER.
EDUTIME Java Day 8 Serdar TÜRKEL.
Kalıtım , Sınıf Asli Ergün.
Demet AYDIN METODLAR Demet AYDIN
BPR152 ALGORİTMA VE PROGRAMLAMA - II Öğr. Gör. Bayram AKGÜL
Nesneye Dayalı Programlama
Class KahveFincani { public KahveFincani() { System.out.println("KahveFincani..."); } } public class YapilandirciBasitOrnek { public static void main(String[]
JAVA’DA DİZİLER Dr.Galip AYDIN.
Sınıflar ve Nesneler Sınıf: bir nesnenin şablonunu, kalıbını, şeklini, davranışını, kalıtımını değişkenleri, metodları ve ebeveynleri vasıtasıyla tanımlar.
Trees, Vectors, Iterators. ADT Abstract Data Type (ADT) vs implementation -Soyut Veri Türleri - Uygulamaları.
Ders İçeriği Liste Soyut veri yapısı (ADT)
Bölüm 9 –Nesneye-Dayalı Programlama: Miras (Inheritance)
Bölüm 5 Nesneler ve Metotlar
Bil 102 Bölüm 6 Diziler.
Hata Ayıklama (Debugging), Arayüzler (Interfaces), Polimorfizm.
Bilgisayar programlarının en büyük avantajı, kullanıcının işini kolaylaştırmalarıdır. Her bilgisayar programı bunu değişik metotlar kullanarak sağlar.
Görsel C# ile Windows Programlama
ODTU-SEM Copyright (c) 2011 Kalıtım(Inheritance) Subclass lar tüm method ve attributes larının superclass ından alırlar. Bu işlem için extends keyword.
SINIFLAR ve NESNELER. İlk sınıfımızı ekleyelim class KrediHesap { public ulong HesapNo; public double Limit; public string KartSahibi; }
KALITIM(INHERITANCE) Öğr.Gör. Murat ASLANYÜREK. KALITIM KAVRAMINA GİRİŞ  Kalıtım, sınıflardan yeni sınıflar türetmeyi sağlar.  Türetilen yeni sınıflar,
JAVA 1. GİRİŞ & TARİHÇE Java, Sun Microsystems mühendislerinden James Gosling tarafından geliştirilmeye başlanmıştır. Açık kodlu. Nesneye yönelik. Düzlemden.
İbrahim Olgaç PROGRAMLAMA DİLLERİ SUNUMU C#
SOYUT(ABSTRACT) SINIFLAR METODLAR
Nesneye Dayalı Programlama Temel Kavramlar Hüseyin ESKİ.
JAVA’DA DİZİLER. Özet  Dizi: belirli sayıda ve aynı veri türünden de ğ işkenlere aynı adla erişilmesini sa ğ layan bir yapıdır.  Dizilerde döngü işlemleri.
Nesneye Dayalı Programlama 1
BLP 4210 PLATFORM BAĞIMSIZ PROGRAMLAMA
Sunum transkripti:

Polimorfizm

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.

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

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

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)

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ış.

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.

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 instanceof ile Dog olduğunu garantilediğimiz şeyi Dog olarak dönüşüm yaptırırız. d = (Dog) animalArray[iIndex] d.bark( );

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?

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 Byte kod JVM Yorumlayı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.

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ı.

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

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

Dinamik bağlama (dynamic Binding) 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) a Animal Dog Object o .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.

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

Sorular?

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

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

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...

Not: abstact sınıflara ait nesneler oluşturulamaz !!! 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! } }

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();

Sorular?

Arayüzler (Interfaces)

Ç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)

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.

Ö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

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

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:

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;

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;

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.

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

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;

Eğer şöyle deseydik ... We use like this: 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;

Sorular?

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ı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

Görünürlük ve Erişim Herhangi bir nesne, her alana ulaşabilir ve her metodu çağırabilir mi? Private Protected Public None Aynı sınıfın içerisinde Evet Aynı paketin içindeki bir alt sınıf Hayır Aynı paketin içinde fakat alt sınıf değil Başka bir paketteki bir alt sınıf Başka bir pakette ve alt sınıf değil

Sorular?