Pascal - Nesne Yönelimli

Evrenimizin güneş, dünya, ay vb. Gibi farklı nesnelerden oluştuğunu hayal edebiliriz. Benzer şekilde, arabamızı tekerlek, direksiyon, dişli vb. Gibi farklı nesnelerden yapılmış hayal edebiliriz. Aynı şekilde, nesneye yönelik programlama kavramları vardır. her şeyi bir nesne olarak varsayın ve farklı nesneler kullanarak bir yazılım gerçekleştirin. Pascal'da, gerçek dünya nesnesini uygulamak için kullanılan iki yapısal veri türü vardır -

  • Nesne türleri
  • Sınıf türleri

Nesneye Yönelik Kavramlar

Ayrıntılara girmeden önce, Nesne Tabanlı Pascal ile ilgili önemli Pascal terimlerini tanımlayalım.

  • Object- Nesne, kayıt gibi alanlar içeren özel bir kayıt türüdür; ancak, kayıtlardan farklı olarak nesneler, nesnenin parçası olarak prosedürler ve işlevler içerir. Bu prosedürler ve işlevler, nesnenin türüyle ilişkili yöntemlere işaret eder.

  • Class- Bir Sınıf, neredeyse bir Nesne ile aynı şekilde tanımlanır, ancak yaratılma şekillerinde bir fark vardır. Sınıf, bir programın Yığını üzerinde tahsis edilirken, Nesne Yığın üzerinde tahsis edilir. Nesnenin kendisine değil, nesneye bir göstericidir.

  • Instantiation of a class- Örnekleme, bu sınıf türünde bir değişken oluşturmak anlamına gelir. Bir sınıf sadece bir işaretçi olduğundan, sınıf türünden bir değişken bildirildiğinde, tüm nesne için değil, yalnızca işaretçi için ayrılmış bellek vardır. Yalnızca kurucularından biri kullanılarak somutlaştırıldığında, nesne için bellek ayrılır. Bir sınıfın örneklerine 'nesneler' de denir, ancak bunları Object Pascal Nesneleri ile karıştırmayın. Bu eğitimde, Pascal Nesneleri için 'Nesne' ve kavramsal nesne veya sınıf örneği için 'nesne' yazacağız.

  • Member Variables - Bunlar bir Sınıf veya Nesne içinde tanımlanan değişkenlerdir.

  • Member Functions - Bunlar, bir Sınıf veya Nesne içinde tanımlanan işlevler veya prosedürlerdir ve nesne verilerine erişmek için kullanılır.

  • Visibility of Members- Bir Nesnenin veya Sınıfın üyelerine alanlar da denir. Bu alanların farklı görünürlükleri vardır. Görünürlük, üyelerin erişilebilirliği, yani bu üyelerin tam olarak nerede erişilebilir olacağı anlamına gelir. Nesnelerin üç görünürlük düzeyi vardır: genel, özel ve korumalı. Sınıfların beş görünürlük türü vardır: genel, özel, kesinlikle özel, korumalı ve yayınlanmış. Görünürlüğü ayrıntılı olarak tartışacağız.

  • Inheritance- Bir Sınıf, bir üst Sınıfın mevcut işlevlerini miras alarak tanımlandığında, miras alındığı söylenir. Burada alt sınıf, bir üst sınıfın tüm veya birkaç üye işlevini ve değişkenini miras alır. Nesneler de miras alınabilir.

  • Parent Class- Başka bir Sınıf tarafından miras alınan bir Sınıf. Buna temel sınıf veya süper sınıf da denir.

  • Child Class- Başka bir sınıftan miras alan bir sınıf. Buna alt sınıf veya türetilmiş sınıf da denir.

  • Polymorphism- Bu, aynı işlevin farklı amaçlar için kullanılabileceği nesne yönelimli bir kavramdır. Örneğin, işlev adı aynı kalacaktır ancak farklı sayıda argüman alabilir ve farklı görevler yapabilir. Pascal sınıfları polimorfizmi uygular. Nesneler çok biçimlilik uygulamaz.

  • Overloading- Bazı veya tüm operatörlerin argümanlarının türüne bağlı olarak farklı uygulamalara sahip olduğu bir polimorfizm türüdür. Benzer şekilde, işlevler de farklı uygulamalarla aşırı yüklenebilir. Pascal sınıfları aşırı yükleme uygular, ancak Nesneler bunu yapmaz.

  • Data Abstraction - Uygulama ayrıntılarının gizlendiği (soyutlandığı) herhangi bir veri temsili.

  • Encapsulation - Bir nesne oluşturmak için tüm verileri ve üye işlevlerini birlikte kapsüllediğimiz bir kavramı ifade eder.

  • Constructor - Bir sınıftan veya bir Nesneden bir nesne oluşumu olduğunda otomatik olarak çağrılacak özel bir işlev türünü ifade eder.

  • Destructor - Bir Nesne veya Sınıf silindiğinde veya kapsam dışına çıktığında otomatik olarak çağrılacak özel bir işlev türünü ifade eder.

Pascal Nesnelerini Tanımlama

Tür bildirimi kullanılarak bir nesne bildirilir. Bir nesne bildiriminin genel biçimi aşağıdaki gibidir -

type object-identifier = object  
   private
   field1 : field-type;  
   field2 : field-type;  
   ...
   public
   procedure proc1;  
   function f1(): function-type;
   end;  
var objectvar : object-identifier;

İki tamsayı türü veri üyesine sahip bir Dikdörtgen Nesnesi tanımlayalım - length ve width ve bu veri üyelerini işlemek için bazı üye fonksiyonları ve dikdörtgeni çizmek için bir prosedür.

type 
   Rectangle = object  
   private  
      length, width: integer; 
   
   public  
      constructor init;  
      destructor done;  
      
      procedure setlength(l: inteter);  
      function getlength(): integer;  
      
      procedure setwidth(w: integer);  
      function getwidth(): integer;  
      
      procedure draw;
end;
var
   r1: Rectangle;
   pr1: ^Rectangle;

Nesnelerinizi oluşturduktan sonra, o nesneyle ilgili üye işlevleri çağırabileceksiniz. Bir üye fonksiyon sadece ilgili nesnenin üye değişkenini işleyebilecektir.

Aşağıdaki örnek, iki dikdörtgen nesne için uzunluk ve genişliklerin nasıl ayarlanacağını ve üye işlevlerini çağırarak nasıl çizileceğini gösterir.

r1.setlength(3);
r1.setwidth(7);

writeln(' Draw a rectangle: ', r1.getlength(), ' by ' , r1.getwidth());
r1.draw;
new(pr1);
pr1^.setlength(5);
pr1^.setwidth(4);

writeln(' Draw a rectangle: ', pr1^.getlength(), ' by ' ,pr1^.getwidth());
pr1^.draw;
dispose(pr1);

Aşağıda, Pascal'da nesnelerin nasıl kullanılacağını gösteren eksiksiz bir örnek verilmiştir -

program exObjects;
type 
   Rectangle = object  
   private  
      length, width: integer; 
   
   public  
      procedure setlength(l: integer);
      function getlength(): integer;  
      
      procedure setwidth(w: integer);  
      function getwidth(): integer;  
      
      procedure draw;
end;
var
   r1: Rectangle;
   pr1: ^Rectangle;

procedure Rectangle.setlength(l: integer);
begin
   length := l;
end;

procedure Rectangle.setwidth(w: integer);
begin
   width :=w;
end;

function Rectangle.getlength(): integer;  
begin
   getlength := length;
end;

function Rectangle.getwidth(): integer;  
begin
   getwidth := width;
end;

procedure Rectangle.draw;
var 
   i, j: integer;
begin
   for i:= 1 to length do
   begin
     for j:= 1 to width do
        write(' * ');
     writeln;
   end;
end;

begin
   r1.setlength(3);
   r1.setwidth(7);
   
   writeln('Draw a rectangle:', r1.getlength(), ' by ' , r1.getwidth());
   r1.draw;
   new(pr1);
   pr1^.setlength(5);
   pr1^.setwidth(4);
   
   writeln('Draw a rectangle:', pr1^.getlength(), ' by ' ,pr1^.getwidth());
   pr1^.draw;
   dispose(pr1);
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Draw a rectangle: 3 by 7
* * * * * * *
* * * * * * *
* * * * * * *
Draw a rectangle: 5 by 4
* * * *
* * * *
* * * *
* * * *
* * * *

Nesne Üyelerinin Görünürlüğü

Görünürlük, nesne üyelerinin erişilebilirliğini gösterir. Pascal nesne üyelerinin üç tür görünürlüğü vardır -

Sr.No Görünürlük ve Erişilebilirlik
1

Public

Üyeler, program birimi dışındaki diğer birimler tarafından kullanılabilir.

2

Private

Üyelere yalnızca mevcut birimde erişilebilir.

3

Protected

Üyeler, yalnızca üst nesneden gelen nesneler tarafından kullanılabilir.

Varsayılan olarak, bir nesnenin alanları ve yöntemleri geneldir ve geçerli birimin dışına aktarılır.

Pascal Nesneleri için Oluşturucular ve Yıkıcılar -

Constructorsbir nesne oluşturulduğunda otomatik olarak çağrılan özel tür yöntemlerdir. Pascal'da bir anahtar kelime yapıcısı ile bir yöntem bildirerek bir kurucu oluşturursunuz. Geleneksel olarak, yöntem adı Init'tir, ancak kendi geçerli herhangi bir tanımlayıcınızı sağlayabilirsiniz. Yapıcı işlevine istediğiniz kadar argüman iletebilirsiniz.

Destructorsnesnenin yok edilmesi sırasında çağrılan yöntemlerdir. Yıkıcı yöntemler, yapıcılar tarafından oluşturulan herhangi bir bellek tahsisini yok eder.

Aşağıdaki örnek, nesne oluşturma sırasında dikdörtgenin uzunluğunu ve genişliğini başlatacak ve kapsam dışına çıktığında onu yok edecek Rectangle sınıfı için bir kurucu ve yıkıcı sağlayacaktır.

program exObjects;
type 
   Rectangle = object  
   private  
      length, width: integer; 
   public  
      constructor init(l, w: integer);
      destructor done;
      
      procedure setlength(l: integer);
      function getlength(): integer;  
      
      procedure setwidth(w: integer);  
      function getwidth(): integer;  
      
      procedure draw;
end;

var
   r1: Rectangle;
   pr1: ^Rectangle;

constructor Rectangle.init(l, w: integer);
begin
   length := l;
   width := w;
end;

destructor Rectangle.done;
begin
   writeln(' Desctructor Called');
end; 

procedure Rectangle.setlength(l: integer);
begin
   length := l;
end;

procedure Rectangle.setwidth(w: integer);
begin
   width :=w;
end;

function Rectangle.getlength(): integer;  
begin
   getlength := length;
end;

function Rectangle.getwidth(): integer;  
begin
   getwidth := width;
end;

procedure Rectangle.draw;
var 
   i, j: integer;
begin
   for i:= 1 to length do
   begin
      for j:= 1 to width do
         write(' * ');
      writeln;
   end;
end;

begin
   r1.init(3, 7);
   writeln('Draw a rectangle:', r1.getlength(), ' by ' , r1.getwidth());
   r1.draw;
   new(pr1, init(5, 4));
   
   writeln('Draw a rectangle:', pr1^.getlength(), ' by ',pr1^.getwidth());
   pr1^.draw;
   pr1^.init(7, 9);
   
   writeln('Draw a rectangle:', pr1^.getlength(), ' by ' ,pr1^.getwidth());
   pr1^.draw;
   dispose(pr1);
   r1.done;
end.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Draw a rectangle: 3 by 7
* * * * * * *
* * * * * * *
* * * * * * *
Draw a rectangle: 5 by 4
* * * *
* * * *
* * * *
* * * *
* * * *
Draw a rectangle: 7 by 9
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
Destructor Called

Pascal Nesneleri için Kalıtım

Pascal nesneleri isteğe bağlı olarak bir üst nesneden miras alabilir. Aşağıdaki program, Pascal Nesnelerindeki kalıtımı göstermektedir. Adlı başka bir nesne oluşturalımTableTop, Rectangle nesnesinden miras alır.

program exObjects;
type 
   Rectangle = object  
   private  
      length, width: integer; 
   public  
      procedure setlength(l: integer);  
      function getlength(): integer;  
      procedure setwidth(w: integer);  
      function getwidth(): integer;  
      procedure draw;
end;

TableTop = object (Rectangle)
   private
     material: string;
   public
      function getmaterial(): string;
      procedure setmaterial( m: string);
      procedure displaydetails;
      procedure draw;
end;

var
   tt1: TableTop;

procedure Rectangle.setlength(l: integer);
begin
   length := l;
end;

procedure Rectangle.setwidth(w: integer);
begin
   width :=w;
end;

function Rectangle.getlength(): integer;  
begin
   getlength := length;
end;

function Rectangle.getwidth():integer;
begin
   getwidth := width;
end;

procedure Rectangle.draw;
var 
   i, j: integer;
begin
   for i:= 1 to length do
   begin
      for j:= 1 to width do
         write(' * ');
      writeln;
  end;
end;

function TableTop.getmaterial(): string;
begin
   getmaterial := material;
end;

procedure TableTop.setmaterial( m: string);
begin
   material := m;
end;

procedure TableTop.displaydetails;
begin
   writeln('Table Top: ', self.getlength(), ' by ' , self.getwidth());
   writeln('Material: ', self.getmaterial());
end;

procedure TableTop.draw();
var
   i, j: integer;
begin
   for i:= 1 to length do
   begin
      for j:= 1 to width do
         write(' * ');
   writeln;
   end;
   writeln('Material: ', material);
end;

begin
   tt1.setlength(3);
   tt1.setwidth(7);
   tt1.setmaterial('Wood');
   tt1.displaydetails();
   writeln;
   writeln('Calling the Draw method');
   tt1.draw();
end.

Aşağıda not edilmesi gereken önemli noktalar yer almaktadır -

  • Nesne Masa Dikdörtgen nesnesinin tüm üyelerini miras aldı.

  • TableTop'ta da bir çizim yöntemi var . Ne zaman beraberlik yöntemi kullanılarak denir TableTop nesnesi, masa en beraberlik yaþamageçirilir.

  • Adında örtük bir örnek var self nesnenin geçerli örneğini ifade eder.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Table Top: 3 by 7
Material: Wood

Calling the Draw Method 
* * * * * * *
* * * * * * *
* * * * * * *
Material: Wood