Nesneye Dayali Programlama - PowerPoint PPT Presentation

About This Presentation
Title:

Nesneye Dayali Programlama

Description:

Nesneye Dayal Programlama DERS 7 – PowerPoint PPT presentation

Number of Views:39
Avg rating:3.0/5.0
Slides: 23
Provided by: NAGEHA2
Category:

less

Transcript and Presenter's Notes

Title: Nesneye Dayali Programlama


1
Nesneye Dayali Programlama
  • DERS 7

2
POLYMORPHISM(Çok Sekillilik)
  • Nesneye Dayali Programlamanin üç önemli kavrami
    vardir
  • 1.Siniflar
  • 2.Türeme(Miras)
  • 3.Çok Sekillilik(Cdaki sanal fonksiyonlar
    tarafindan gerçeklestirilir)
  • Gerçek hayatta, ayni komutu(mesaji) alan yanliz
    buna farkli sekillerde cevap veren pek çok nesne
    vardir.

3
  • Yönetici ve ögretmen örnegini ele alalim.
  • Örnegin Milli Egitim Bakani bütün personele
    kisisel bilgilerinizi yazdirin diye bir
    direktif veriyor.
  • Degisik türde personel, degisik bilgi verecektir.
    Fakat bakanligin her biri için ayri direktif
    vermesine gerek yoktur.Bir mesaj hepsi için
    geçerlidir, çünkü bütün personel kisisel
    bilgilerini nasil yazdirmalari gerektigini
    bilmektedir.
  • Ayrica bakanligin, direktifin gittigi personelin
    de ne tür bir çalisan oldugunu bilme zorunlulugu
    yoktur.

4
  • Polymorphism çok sekil alabilmek demektir.
    Bakanin direktifi polimorfiktir çünkü her çesit
    personele farkli gözükmektedir. Ayrica bakan
    mesaji gönderdigi personelin ögretmen yada müdür
    olup olmadigini bilmek zorunda degildir.
  • Ayni sekilde, Polymorphism miras yoluyla
    birbiriyle iliskilendirilmis siniflardada meydana
    gelir.

5
  • Cda polymorphism mesaji alan farkli türde
    nesnelerin farkli fonksiyonlar çagirmasina neden
    olacak üye fonsiyon çagirmaya denir.
  • Mesajin göndericisinin,mesaji alan nesnenin
    türünü bilmesi gerekmemektedir.
  • Kulaga biraz overloading olayi gibi gelsede
    polymorphism daha degisik ve güçlü bir
    mekanizmadir.

6
Pointerlar tarafindan erisilebilen normal üye
fonsiyonlar
  • Asagidaki örnekte, taban ve türemis siniflarda
    ayni isimlerde fonksiyonlar bulundugu zaman ve
    pointer kullanarak sanal(virtual) fonksiyonlar
    olmadan bu fonksiyonlara erisilmeye çalisildigi
    zaman ne olacagi gösterilmektedir.

7
  • ÖRNEK 1
  • class Teacher // Taban sinif
  • string name
  • int numOfStudents
  • public
  • Teacher(const string , int) // Taban sinif
    kurucusu
  • void print() const
  • class Principal public Teacher // Türemis
    sinif
  • string SchoolName
  • public
  • Principal(const string , int , const string
    )
  • void print() const
  • Her iki sinifin da print adinda bir fonksiyonu
    vardir. Fakat bu örnekte bu fonksiyonlar
    sanal(polimorfik) degildir.

8
  • void show (Teacher tp)
  • tp-gtprint() // yazdirma
  • // show fonksiyonunu test etmek için yazilmis
    main program
  • int main()
  • Teacher t1("Teacher 1",50)
  • Principal p1("Principal 1",40,"School")
  • Teacher ptr
  • char c
  • cout ltlt "Teacher or Principal " cin gtgt c
  • if (c't') ptrt1
  • else ptrp1
  • show (ptr) // which print
  • return 0

9
  • Principal sinifi Teacher sinifindan türemistir.
    Iki sinifinda print() isminde üye fonksiyonu
    vardir.
  • Main() de, program Teacher ve Principal
    siniflarinin birer nesnesini ve Teacher sinifina
    bir pointer olusturur.
  • Main program bazen teacher nesnesinin bazen de
    türemis sinif nesnesinin(Principal) adresini
    taban sinif pointerina koyar
  • ptr p1

10
  • Hatirlayalim ki Türemis nesnenin adresi taban
    sinifin pointerina verilebilir. Bu adres show()
    fonksiyonunda,pointer vasitasiyla tabana
    gönderilebilir.
  • Taban siniftaki(Teacher) fonksiyon her iki
    durumda da çagirilmistir. Derleyici pointerin
    içerigini(ptr) görmezden gelir, pointerla ayni
    türü tutturan üye fonksiyonu seçer.

11
Pointerlarla Erisilebilen Sanal Üye Fonksiyonlar
  • Programda küçük bir degisiklik yapalim.Taban
    siniftaki print() fonksiyonunun prototipinin
    önüne virtual kelimesini koyalim.
  • ÖRNEK 2
  • class Teacher // taban sinif
  • string name
  • int numOfStudents
  • public
  • Teacher(const string , int) // taban sinif
    kurucusu
  • virtual void print() const // sanal
    (polymorphic) fonksiyon
  • class Principal public Teacher // turemis
    sinif
  • string SchoolName
  • public
  • Principal(const string , int , const string )
  • void print() const // dolayisiyla bu da sanal
    (polymorphic)

12
  • Bu örnekte, ptrnin içerigine göre degisik
    fonksiyonlar çalistirilmistir.
  • Fonksiyonlar pointerin türüne göre degil,
    içerigine göre çagirilmistir.

13
Çok Sekillilik(Polymorphism)in Yararlari
  • Esneklik saglar.
  • Bizim örnegimizde show(), girdi parametresinden
    nesnenin türüyle ilgili bilgi almamistir. Teacher
    sinifindan türemis herhangi bir nesnenin adresini
    alabilir.
  • Yani bu fonksiyon Teacher sinifindan türemis
    bütün siniflarla çalisabilir.
  • Eger programa baska bir ögretmen türü(baska bir
    sinif) eklersek, örnegin InternTeacher, show()
    fonksiyonunu degistirmemize gerek yoktur.
  • Ayni sey, programdan Teacher sinifindan türemis
    baska bir sinifi çikarmak istedigimiz zamanda
    geçerlidir.

14
  • Sunu unutmayalim ki, Cda parametreyle pointer
    göndermektense, referans göndermek tercih edilir.
  • Ayni program asagidaki gibi yazilabilir
  • void show (const Teacher tp)
  • tp.print() // which print
  • int main()
  • Teacher t1("Teacher 1", 50)
  • Principal p1("Principal 1", 40, "School")
  • char c
  • cout ltlt "Teacher or Principal " cin gtgt c
  • if (c 't') show(t1)
  • else show(p1)

15
Late Binding(Geç Baglama)
  • Derleyici hangi fonksiyonu derlemesi gerektigini
    nerden bilecektir? Birinci örnekte, polymorphism
    olmadan, derleyici
  • tp-gtprint() ifadesiye ilgili bir sorun
    yasamamaktadir.
  • Her zaman taban sinifin print() fonksiyonunu
    çagirarak derleme yapmaktadir.
  • Ancak ikinci örnekte derleyici, tpnin içeriginin
    hangi sinifa isaret ettigini bilmemektedir.
    Teacher yada Principal siniflarinda herhangi
    birinin nesnesinin adresi olabilir. Derleyici
    hangi print()i çagiracak. Gerçekte, derleme
    esnasinda, derleyici hangi programi çagiracagini
    bilmez, onun yerine oraya kod parçasi
    yerlestirir.
  • Yürütme sirasinda, foksiyon bildirimi
    çalistirildigi zaman, derleyici tarafindan
    yerlestirilen kod, tpnin içinde adresi olan
    nesnenin çesidini bulur ve uygun print()
    fonksiyonu çalistirir. Teacherprint() veya
    Principalprint().

16
  • Fonksiyonun yürütme esnasinda belirlenmesine late
    binding veya dynamic binding denir.(Binding
    fonksiyon çagirimiyla fonksiyonu birlestirmek
    demektir).
  • Fonksiyonlarla normal sekilde birlestirmeye
    early binding veya static binding denir.
  • Late binding digerinden daha fazla zaman alir,
    ancak programa güç ve esneklik saglar.

17
Nasil Çalisir?
  • Hatirlayalimki, hafizada saklanan normal bir
    nesne(sanal fonksiyonu bulunmayan), sadece kendi
    verilerini içerir.
  • Üye fonksiyon böyle bir nesne için çagirildigi
    zaman, derleyici fonksiyonu çagiran nesnenin
    adresine geçer.
  • Bu adres, fonksiyon için thisin içinde
    tutulmaktadir,fonksiyon bu adresi nesnenin
    verilerine ulasmak için kullanmaktadir.

18
  • Thisin içinde bulunan adres, her üye fonksiyon
    çagriminda derleyici tarafindan otomatik olarak
    üretilir.
  • Nesne içerisinde tutulmaz ve hafizada yer
    kaplamaz.
  • This pointeri nesneyle, normal nesne
    fonksiyonlari arasinda baglantiyi saglayan tek
    seydir.

19
  • Sanal fonksiyonlarla hersey daha karmasik bir hal
    alir.
  • Sanal fonksiyonlarla türemis bir sinif
    tanitildigi zaman, derleyici fonksiyon
    adreslerinin tutuldugu bir sanal tablo
    olusturur.ikinci örnekte Teacher ve Principle
    siniflarinin herbirinin kendi sanal tablosu
    vardir.
  • Her sanal tabloda her bir sanal fonksiyon için
    giris vardir.
  • Sanal fonksiyon içeren siniflarin nesneleri
    sinifin sanal tablosuna isaret eden bir pointer
    içerir.
  • Bu nesneler normal nesnelerden biras daha
    büyüktür.
  • Örnekte sanal bir fonksiyon Teacher ve ya
    Principle nesnesi için çagirildigi zaman,
    derleyici hangi fonksiyonun çagirilacagini
    belirlemek yerine, nesnenin sanal tablosuna bakan
    ve daha sonra bunu kullanarak uygun üye
    fonksiyonun adresine erisimi saglayan bir kod
    üretir. Dolayisiyla, sanal fonksiyonlar için,
    derleyici yerine nesnenin kendisi hangi
    fonksiyonu çalistiracagina karar verir.

20
  • ÖRNEK 3 Teacher ve Principle siniflarinin her
    ikisininde 2 sanal fonksiyon içerdigini
    varsayalim.

class Teacher // Taban sinif string name int
numOfStudents public virtual void read() //
Sanal fonksiyon virtual void print() const //
Sanal fonksiyon class Principal public
Teacher // Türemis sinif string
SchoolName public void read() // sanal
fonksiyon void print() const // sanal
fonksiyon
21
  • Teacher ve Principle siniflarinin nesneleri kendi
    sanal tablolarina erisebilmek için pointer
    içerirler.

22
Bunu nesnelerle denemeyin
  • Sanal fonksiyon mekanizmasi sadece nesne
    pointerlari ve referanslarla çalisir, nesnelerin
    kendisiyle degil.
  • int main()
  • Teacher t1("Teacher 1", 50)
  • Principal p1("Principal 1", 40, "School")
  • t1.print() // polymorphic degil
  • p1.print() // polymorphic degil
  • return 0
  • Sanal fonksiyon çagirimi, tablolarla direk
    olmayan çagirimlar oldugu için zaman
    kaybettiricidir.
Write a Comment
User Comments (0)
About PowerShow.com