Site Renkleri

Perl Dersleri

sub print, sub destroy



// BMW.h - BMW sinif deklarasyonu
#include "Araba.h"
class BMW : public Araba
{
public: BMW(char*, int);
~BMW();
};
// BMW.cpp - BMW sinif definisyonu
// Konstruktör
BMW::BMW(char* x, int y):Araba(x,y)
{ }
// Destruktör BMW::~BMW() { }

BWM sinifi icin gerekli tanimlari yaptikran sonra, ana programimizi yazabiliriz.

//main.cpp
#include
#include "Araba.h"
#include "Mercedes.h"
#include "BMW.h"
void main(void)
{
Mercedes m1("E-200","34-MSB-24",90);
BMW b1("34-FO-060",150);
m1.print();
b1.print();
}

#include direktifi ile, ana- ve altsinif kodlari ana programa eklenir. Mercedes m1("E-200","35-AH-119",90); komutu ile m1 isminde Mercedes sinifindan bir nesne ürettik. Parantez icinde, Mercedes sinifinin kontruktörüne gönderilmek üzere parametreler yer aliyor. Nesnenin sahip oldugu degiskenleri ve degerlerini ekrana basmak icin print() fonksiyonunu kullanacagiz. print() fonksiyonu, Mercedes altsinifina Araba sinifindan miras kalmisti. m1.print(); komutu ile m1 isimli nesneye mesaj göndererek, print() fonksiyonunu calistirmasini söylüyoruz.
Ekran cikisi:

Model: E-200 Plaka: 34-MSB-24 Beygirgucu: 90

Print() metodunu Mercedes altsinifinda degistirdigimiz icin, model degiskeninin degeri de digerlerinin yanida ekrana basilir. Eger Mercedes sinifinda print() isminde bir fonksiyon tanimlamamis olsaydik, nesne, anasinif icinde yer alan print() fonsiyonunu calistiracakti ve ekran cikisi söyle olacakti:

Plaka: 34-MSB-24 Beygirgucu: 90

Ana sinifta yer alan print() fonsiyonunun, Mercedes sinifinda yeralan model degiskeninden haberi olmadigi icin, sadece plakano ve beygirgucu degiskenlerini ekrana basar. Gercektende ana siniflar, altsiniflarinda hangi metodlarin ve degiskenlerin yer aldigini bilmezler. Bunun aksine, alt siniflar, anasinifta yer alan tüm metod ve degiskenleri tanirlar.
OOP yi ve kullanilan terimleri tanidiktan sonra, bu örnegi Perl dilinde yazalim.

#!/usr/bin/Perl
use strict;
print "Content-type: text/html\n\n";
######### Class Araba######
package Araba;
sub araba
{
my $class=shift;
my $this={};
$this->{'plakano'}=shift;
$this->{'beygirgucu'}=shift;
bless($this, $class);
}

Perl'de siniflar paket (package) olarak tanimlanir. C++ örneginde oldugu gibi, sinif isminde bir konstruktör tanimliyoruz. shift, bir subrutine gönderilen parametrelere sirayla ulasabiliriz. Yeni bir nesne üremek icin araba() kontruktörü calistirildiginda, shift üzerinden sirasiyla ulasabilecegimiz bilgiler: sinifismi, plakano ve beygirgücüdür.
Önce shift icinde bulunan ilk bilgi (sinif ismi) $class degiskenine esitlenir. $class degiskeni yardimiyla, üretilecek nesnenin hangi siniftan oldugu tespit edilir. $this, C++ dilinde de kullanilan bir referanstir. Perl de nesnelere referanslar üzerinden ulasilir. Nesnenin sahip oldugu degisken degelerini yerlestirmek icin hash tipi bir liste kullanilir. bless fonksiyonu ile nesne canlanir.

sub print
{
my $this=shift;
print "$this->{'plakano'}\n";
print "$this->{'beygirgucu'}\n";
}

print() subrutini nesne degiskenlerinin degerini ekrana basar. Herhangi bir nesne tarafindan bu metod cagrilidiginda, metoda, shift üzerinden nesne kimligi gönderilir. Bu kimligi $this referansina esitleyerek, subrutin icinde nesne icin gerekli islemleri yapabiliriz.
print "$this->{'plakano'}\n"; ile nesnenin sahip oldugu $plakano isimli degiskenin degeri ekrana basilir. Daha öncede belirttigim gibi, bir nesnenin tüm degisken ve degerleri hash tipi bir listede saklanir. Bu liste araba() konstruktörü tarafindan yaratilir. $this üzerinden nesnenin sahip oldugu tüm degiskenlere ulasabiliriz. ;

sub DESTROY
{
print "Nesnenin hayati son buldu.";
}

Program bitimiyle tüm nesnelerin hayatina son verilir. Nesnenin yasamina son verilmeden önce, DESTROY metodu cagrilir. DESTROY sinif icinde destruktör vazifesi görür.

###### Class Mercedes #######
package Mercedes;
use vars qw(@ISA);
@ISA=qw(Araba);

Perl dilinde altsiniflara miras birakma islemi @ISA listesi üzerinden gerceklesir. @ISA icinde tüm üstsiniflar tanimlanir. Bu konuyu detayli olarak ilerleyen satirlarda inceleyecegiz.

# Kontruktör
sub mercedes
{
my $class=shift;
my $model=shift;
my $plaka=shift;
my $ps=shift;
my $this=Araba->araba($plaka,$ps);
$this->{'model'}=$model;
bless($this, $class);
}
sub print
{
my $this=shift;
print "$this->{'model'}\n";
print "$this->{'plakano'}\n";
print "$this->{'beygirgucu'}\n";
}

Mercedes sinifini Araba sinifinin altsinifi olarak tanimliyoruz. Mercedes @ISA listesin üzerinden bütün Araba metod ve degiskenlerine ulasabilir. Simdi ana programi yazalim:

package main;
my $b1=Mercedes->mercedes("E-200","34-MSB-24",95);
$b1->print();

Ana program yazmak icin main isminde bir paket tanimlamamiz gerekiyor. Daha sonra Mercedes sinifinda yer alan mercedes konstruktörünü kullanarak, $b1 isminde bir nesne olusturuyoruz. $b1 bir referanstir. Bu referansi kullanarak, print() metodunu cagiriyoruz.
Program icinde dikkatinizi cekmis olabilecek birkac noktaya deginmek isiyorum:

* C++ aksine, Perl dilinde konstruktörler derleyici tarafinda otomatik olarak calistirilmaz. C++ dilinde, sinif isminde bir konstruktörün tanimlanmis olmasi gerekir. Perl de böyle bir zorunluluk yok. Konstruktör herhangi bir isimde olabilir. Nesneleri olusturmak icin konstruktörü calistirmaniz gerekir.
* Nesneleri yok etmek icin destruktörü calistirmaniz gerekmez. Bu islemi paketin sahip oldugu destruktör otomatik olarak yapar.
* Bir sinifin metodlarina degisik sekilde parametre girisi yapilir. Örnegin konstruktörler parametre olarak önce sinif ismini alirlar. Normal sinif metodlarina önce nesneye ait $this referansi gönderilir.
* Siniflar arasi miras birakma ve alma @ISA listesi üzerinden gerceklesir. Bu liste icinde tüm ana siniflar yer alir.
* C++ dilinde yer alan public, private, protected koruma mekanizmalari Perl dilinde yoktur.
* Sinif tanimlamak icin kullanilan class gibi özel bir kelime yoktur.
* Metodlar sinif icinde tanimlanir. Sinif icinde kullanilan degiskenlere, hash tipi bir liste üzerinden ulasilabilir. Üretilen her nesnenin, degiskenlerini ve degerlerini sakladigi hash tipi bir listesi vardir.
* Nesneler Perl'de hangi sinifi ait oldugunu bilen referanslardir. Nesne hangi sinifa ait oldugunu bless() fonksiyonu araciligiyla ögrenir. Her konstruktörün en son satirinda bless() fonksiyonu yer alir.

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