Title: Nesneye Dayali Programlama
1Nesneye Dayali Programlama
2POLYMORPHISM(Ç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.
6Pointerlar 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.
11Pointerlarla 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)
-
15Late 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.
17Nasil Ç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.
22Bunu 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.