Site Renkleri

Perl Dersleri

Sınıflar, Nesneler, Metodlar, Konstruktör, Destruktör, Miras



Sınıflar:
OOP türü yazdigimiz programlarda sadece nesneler vardir. Bu nesneler, mesaj alisverisi yaparak, birbirleriyle haberlesirler.
Nesneler OOP de sinif olarak ifade edilen sablonlardan yaratilir. Her sinif icinde, o siniftan üretilecek nesnelerin özelikleri, davranislari tespit edilir. Örnegin Araba isminde bir sinif yaratabiliriz. Bu siniftan üretilecek nesnelerin ortak yani, bir motor, 4 teker, direksiyon gibi parcalar olacaktir.
Siniflar, nesne üretme yaninda baska bir özellige daha sahiptir. Siniflar arasinda akraba ve is iliskileri kurmak mümkündür. Siniflar hakkinda daha genis bilgiyi, bu bölümün ilerleryen satirlarinda bulacaksiniz.

Nesneler:
OOP de nesneler siniflardan üretilir. Nesneler, siniflarin aksine canlidir ve kimlikleri vardir. Ayni siniftan üretilmis iki nesnenin sahip oldugu degiskenler degisik degerlere sahiptir. Örnegin araba sinifindan üretilen Mercedes ve BMW marka iki arabanin plaka numaralari degisiktir. Burada adi gecen plaka numarasi, sinif icinde yer alan bir özelliktir. Siniftan üretilen her nesne bu özelligi alir. Nesneler üretilirken, nesne özellikleri, sahip olduklari yapiya göre, degisik olacaktir. Araba örneginde oldugu gibi, Mercedes ve BMW nesneleri degisk plaka numaralarina sahiptir.
Yazilan OOP programlarda sadece nesneler ve aralarindaki interaksiyon söz konusudur

Metodlar:
Metodlar bir nesnenin dis dünyaya acilan kapilaridir. Bir nesnenin icinde ne oldugu, nesnenin nasil calistigi disaridan görünmez. Nesnenin sahip oldugu bir ic dünyasi vardir. Eger nesne ile interaksiyona girmek istiyorsak, disa acilan kapilarindan (metodlardan) birini kullanmamiz gerekir. Nesnelere, sinif icinde tanimlanmis ve her nesnenin sahip oldugu metodlar araciligiyla mesaj gönderebiliriz. Eger bir nesneden birsey yapmasini bekliyorsak, metodunu kullanarak, ona bir mesaj göndeririz. Nesne bu mesaji alarak, gerekli islemi yapar.
Metodlar nesnelerin dis dünyaya karsi davranislarini tanimlar. Metodlari, diger programlama dillerinde kullanilan fonksiyonlar olarak düsünebiliriz. Nesneler ile sadece bu metodlari kullanarak, interaksiyona girebiliriz.

Konstruktör:
Nesnelerin siniflardan yapildigini daha önce ögrendik. Nesneler üretilirken, sahip olduklari degiskenlerin degisik degerlerde olmasi gerekir. Araba örneginde oldugu gibi, Mercedes ve BMW marka iki nesnenin degisik plaka numaralarina sahip olmalari gerekir. Bu demek oluyor ki, nesneler üretiliken, onlara degisik kimlikler verecek bir mekanizmaya ihtiyacamiz var.
Bu görevi sinif icinde konstruktörler üstlenir. Nesneler konstruktörler araciligiyla üretilir. Konstruktör bir nesne üretmeden önce, nesne icin gerekli degisken degerleri belirlenir ve bu degerler parametre olarak konstruktöre gönderilir. Kontsruktör bu degerleri kullanarak, nesneyi üretir. Her sinif icinde, nesne üretmek icin bir kontruktör vardir.

Destruktör:
Her sinif icinde kontruktör yaninda birde destruktör bulunur. Destruktörün görevi hayati sona ermis bir nesneyi sistem üzerinden uzaklastirmaktir. Program bitiminde üretilen bütün nesneler destruktör araciligiyla yok edilir.

Miras:
OOP nin en büyük özelliklerinden birisi, siniflar arasindan miras birakma teknigiyle, yazilan kodun, defalarca baska bölümlerde kullanilabilmesidir.
Nesneler siniflardan üretilir. Tasit isminde bir sinifimiz oldugunu düsünün. Bu siniftan motorlu tasitlar ve motorsuz tasirlar isminde iki alt-sinif üretmemiz mümkündür. Bu üretilen iki alt sinif, tasit isimli sinifta olan tüm nesne metod ve degiskenleri miras olarak alirlar. Alt siniflardan bir gram kod eklemeden, nesneler üterebiliriz Alt siniflarda gerekli degisiklikleri yaparak, bu sinifin nesnelerini özellestirebiliriz. Örnegin motorlu tasit sinifina, beygirgücü isminde bir degisken ekleyebilriz. Bu alt siniftan üretilecek bir nesne, tasit isimli sinifta olan tüm metod ve degiskenleri miras olarak aldigi gibi, ayrica beygirgücü isminde yeni bir degiskene daha sahip olacaktir.
Gördügümüz gibi, miras birakma teknigi ile, bir kere yazilan kod, defalarca kullanilabilir. Miras (inheritance) teknigi bunu mümkün kiliyor. Miras birakmanin ve almamini nasil kullanildigini, asagida yer alan örnegimizde görecegiz.
C++ ve Java dillerinde oldugu gibi, Perl dilinde OOP tarzi programlar yazmak mümkündür. Perl dilinde OOP tarzi programlarin nasil yazildigini incelemeden, C++ dilinde bir programi inceleyelim. OOP terimlerini bu örnek üzerinde göstermek istiyorum. Daha sonra bu programin Perl dilinde nasil yazilacagini görecegiz.
Yazacagimiz örnekte Araba isimli bir sinif yer alacak. Miras birakma teknigini kullanarak, Mercedes ve BMW isimlerinde iki alt-sinif üretecegiz. Bu altsiniflara, Araba anasinifinda yer alan tüm metod ve degiskenlerin miras kalmasi yaninda, altsiniflar, kendileri icin gerekli degiskenleri de tanimlayacaklar.
Bu C++ örnegini MS Visual C++ 6.0 programi ile derledim. Programi derlemek icin herhangi bir C++ derleyicini kullanabilirsiniz.

Program asagida yer alan dosyalar icinde yer alacak:
" Araba sinifi deklarasyonu, Araba.h,
" Araba sinifi definisyonu, Araba.cpp
" Mercedes altsinifi deklarasyonu, Mercedes.h,
" Mercedes altsinifi definisyonu, Mercedes.cpp,
" BMW altsinifi deklarasyonu, BMW.h,
" BMW altsinifi definisyonu, BMW.cpp,
" Ana program main.cpp
// Araba.h - Araba sinif deklarasyonu
class Araba
{
public: Araba();
void print();
Araba(char*, int);
~Araba();
protected:
int beygirgucu;
char* plakano;
};

Class direktifi ile bir sinif tanimlanir. Public bölümünde, sinif icinde yer alacak ve sonra üretilen nesneler tarafindan kullanilcak metodlar yer alir. Nesneleri üretmek icin Araba(char*, int) kontruktörü kullanilir. Konsruktöre bir string ve integer parametre olarak gönderilir. Bunun ne anlama geldigini daha sonra görecegiz.
Protected bölümü icinde, nesnelerin sahip olacaklari degiskenler yer alir. Protected ve Private sayesinde, bu degiskenler, disaridan gelebilecek saldirilara karsi korunur. Bu degiskenler sadece sinif metodlari kullanilarak degistirilebilir. OOP de nesnelerin ic hayatlarinin korunmasi önemli bir prensiptir. Hicbir sekilde, nesnenin sahip oldugu degerler disardan degistirilememelidir. Bu islem, metodlar arciligiyla nesneye mesaj gönderilerek yapilabilir. Araba sinifinin beygirgucu ve plakano isminde iki degiskeni vardir. Buna göre, bu siniftan üretilen her nesne yukarda yer alan metod ve degiskenlere sahip olacaktir. Konstruktör kullanilarak, her nesneye baska bir baslangi degeri verilir. Bu sadeye üretilen her nesne baska bilgileri tasir.

// Araba.cpp - Araba sinif definisyonu
#include
#include "Araba.h"
// Konstruktör
Araba::Araba(char* plaka, int ps)
{
plakano=plaka;
beygirgucu=ps;
}
//Destruktör
Araba::~Araba() { }
//Print metodu
void Araba::print()
{
cout<<"Plaka:"<< plakano<<"Beygirgucu:"< // Standart kontruktör
Araba::Araba()
{
beygirgucu=0;
plakano=0;
}

Araba.cpp dosyasinda sinifin metodlari yazilir. Araba::Araba(char* plaka, int ps) seklinde kontruktörü tanimliyoruz. Bu konstruktörü kullanarak, üretecegimiz nesnelere baslangic degerleri verecegiz.

// Mercedes.h - Mercedes sinif deklarasyonu
#include "Araba.h"
class Mercedes : public Araba
{
public:
void print();
Mercedes(char*, char*, int);
~Mercedes();
private:
char* model;
};

Araba sinifindan, class Mercedes : public Araba tanimlamasini kullanarak, Mercedes isminde bir altsinif olusturuyoruz. Bu andan itibare, Mercedes sinifi, Araba sinifinin tüm özellikleri alir.
Araba ve Mercedes siniflari arasinda baglanti kurabilimek icin #include "Araba.h" direktifiyle, Araba.h dosyayini Mercedes.h dosyayina ekliyoruz.
Mercedes(char*, char*, int); konstruktörü ile, Mercedes Marka arabalari üretecegiz. Araba konstruktörünün aksine bu kontruktör üc parametre aliyor. Mercedes marka bir araba ürettigimizde, plakano ve beygirgücü degiskenleri yaninda, Mercedes konstruktörüne model degiskeninide parametre olarak, gönderecegiz. Gördügünüz gibi, Mercedes, Araba'nin alt sifini oldugundan, Mercedes sinifi icinde plakano ve beygirgucu degiskenlerini kolayca kullanabiliyoruz.

// Mercedes.cpp - Mercedes sinif definisyonu
// Konstruktör
Mercedes::Mercedes(char* mod, char* plaka, int ps) :Araba(plaka,ps)
{
model=mod;
}
// Destruktör
Mercedes::~Mercedes() { }
// Araba sinifindan aldigimiz ve redefine ettiginiz Print metodu
void Mercedes::print()
{
cout<<"Model:"< Araba::print();
}

Mercedes.cpp dosyasi icinde dikaktinizi ceken satir Mercedes::Mercedes(char* mod, char* plaka, int ps) :Araba(plaka,ps) olmustur. Mercedes marka bir araba üretebilmek icin model, plakano ve beygirgucu degiskenlerini parametre olarak Mercedes Kontruktörüne gönderiyoruz. Arabamiz bu degerlerle üretilecektir.
Peki :Araba(plaka,ps) ne anlama geliyor?
Altsiniflardan üretilen her nesne icinde, ana siniftan üretilmis bir nesne yer alir. Altsinif icinde kod eklemesi yapmadan, ana sinifta yer alan metod ve degiskenleri kullanmamiz, nesne icinde yer alan, anasinifi nesnesi üzerinden olur. Nesneler üretilirken, konstruktörler aracigiyla istenen baslangic degerleri tespit edilir. Her sinif icinde bir standart konstruktör vardir. Alt siniftan bir nesne ürettigimizde, bu nesne icinde yer alacak anasinif nesnesininde bir baslangic degerine sahip olmasi gerekir. Bunu : :Araba(plaka,ps) seklinde bir tanimlamayla yapabiliriz. Mercedes nesnesi icin model, plakano ve beygirgucu parametrelerini alarak, baslangic degerlerini belirliyoruz. Model degiskeni Mercedes icinde yer aldigi icin, esleme bu sinif icinde yapiliyor. Diger iki parametre, ana sinif icinde bulunan degiskenlere eslenmesi gerektigi icin, Araba(plaka, ps) seklinde anasinif konstruktörüne gönderilir. Ana sinif bu parametreleri alarak, degiskenlere gerekli baslangic degelerini verecektir. Böylece Mercedes nesnesi gecerli baslangic degerlerine sahip olacaktir.
Nesneler, anasiniftan miras kalan tüm metod ve degiskenleri kullanabilirler. Isteyen altsiniflar, anasiniftan aldiklari metodlar üzerinde degisklik yapabilirler. Yukardaki örnekte, Mercedes sinifi, anasinif icinde tanimlanmis print() metodunu alarak, model degiskeninin degerini ekrana basmak icin degistirmistir. Araba::print(); komutuyla, anasinif icinde tanimlanan print() fonksiyonu calistirilir. Bu fonsiyon plakano ve beygirgucu degiskenlerinin degerini ekrana basar. Mercedes sinifinda, miras kalan print() fonksiyonu genisletilerek, plakano ve beygirgucu degiskenleri yaninda model degiskeninin degeride ekrana basilmis olur.

Web Tasarımı | Site Tasarımı | Bilgisayar Dersleri | Hosting | Domain