20 Ocak 2018 Cumartesi

Delphi Sınıf yapısı - Başlangıç

Class (sınıf) : Giriş
Temel olarak bir sınıf içindeki şu üyeleri taşıyan bir yapıdır;
-Alanlar (fields), ya da sınıf içinde tanımlanmış değişkenlerdir.
-Metotlar (methods), ya da sınıf içinde tanımlanmış prosedür veya fonksiyonlardır.
-Öznitelikler (properties), sınıf içinde tanımlanmış alanlara değer atamak veya bazı koşullara göre belli bir alandan ya da hesaplanmış bir değeri dışarı vermek için kullanılan yapıtaşıdırlar.
-Ve bunların dışında, daha sonraki yazılarda yer alacak farklı şeyler de söz konusudur.

type
  TMeyve = class(TObject)
  strict protected
    FAdi : string;
    FCekirdekMiktari : Integer;
    FAgirlik : Double;
    FRenk : string;
    FTat : string;
    FKoku : string;
  public
    property Adi : string read FAdi;
    property CekirdekMiktari : integer read FCekirdekMiktari;
    property Agirlik : Double read FAgirlik write FAgirlik;
    property Renk : string read FRenk write FRenk;
    property Tat : string read FTat write FTat;
    property Koku : string read FKoku write FKoku;

    procedure Ozellikler; virtual;
  end;

procedure TMeyve.Ozellikler;
begin
  WriteLn('Adı '+Adi);
  WriteLn('--------------------------------------------------');
  WriteLn('Çekirdek miktarı (ortalama adet) : '+IntToStr(CekirdekMiktari));
  WriteLn('Ağırlık (ortalama gram) : '+FloatToStr(Agirlik));
  WriteLn('Renk (en bilinen) : '+Renk);
  WriteLn('Tat : '+Tat);
  WriteLn('Koku : '+Koku); 
end;

Burada bir nesne tanımlaması ve bir metot görülüyor. Farkettiğiniz gibi normal prosedürden, değişkenlerden farkı yok. Ancak en büyük fark, bunlardan 2 adet Create etsek (creating an instance), yani 2 adet nesne oluştursak, her ikisindeki metot ve alanlar kendi nesnelerine ait özellikler-nitelemeler olacaktır ve ikisininkiler birbirinden farklı olacaktır. Yani birinin özelliğini değiştirince diğerinin özelliği değişmeyecektir.

Bir metot varsayılan olarak statik metotdur yani sanal (virtual) değildir.
Bu örnekte Ozellikler metodu kalıtım örneğidir ve sanaldır. TMeyve'den türeyen başka bir sınıf oluşturduğumuzda bu metodu ezebiliriz ya da bunu olduğu gibi kullanabiliriz. Örneğin;

  TAyva = class(TMeyve)
    constructor Create;
  end;

  TChiquitaMuz = class(TMeyve)
  strict private
    FMensei : string;
  public
    property Mensei: string read FMensei write FMensei;
    constructor Create;
    procedure Ozellikler; override;
  end;

{ TAyva }

constructor TAyva.Create;
begin
  inherited;
  FAdi := 'Ayva';  // Adi alanını değiştiremiyorum. Çünkü //setter'i yok...
  FCekirdekMiktari := 20;     // Aynı şekilde
  Agirlik := 235;
  Renk := 'Sarı';
  Tat := 'Ekşi, boğaza yapışan';
  Koku := 'Bilindik özellikli bir kokusu yok';
end;

{ TChiquitaMuz }

constructor TChiquitaMuz.Create;
begin
  FAdi := 'Çikita Muz';  // Adi alanını değiştiremiyorum. Çünkü setter'i yok...
  FCekirdekMiktari := 0;     // Aynı şekilde
  Agirlik := 110;
  Renk := 'Sarı';
  Tat := 'Tatlı';
  Koku := 'Az koku vardır';
  Mensei := 'Nikaragua';
end;

procedure TChiquitaMuz.Ozellikler;
begin
  inherited;
  Writeln('Menşei : '+Mensei);
end;



TAyva'nın TMeyve'dekinden başka bir özniteliği yoktur, bu nedenle sadece constructor metodu bulunur. Constructor metodunun bulunması sebebi ise özniteliklerini tanımlamaktır. TChiquitaMuz'un fazladan Mensei özniteliği vardır. Bu nedenle Ozellikler metodunu ezmek ve onun içinde de Mensei'ni yazdırmak gereklidir. inherited ile TMeyve'de olan özellikler yazılır, hemen altında ise TChiquitaMuz'un özelliği, Mensei yazılır.

Ancak bu örnek tipik bir sanal (virtual) metot örneği değil. Neden değil, çünkü bu işi biraz farklı şekilde de olsa sanal metot kullanmadan da yapabiliriz. Ancak tipik örneklerde, yani nesneyi kullanırken sınıf olarak sadece TMeyve'den türediğini biliyorsak ve hangi meyve olduğunu bilmiyorsak, işte o zaman kalıtımın saf haliyle tipik örneğini uyguluyoruz demektir. Sonraki yazıda en tipik haliyle kalıtımı inceleyeceğiz.





Hiç yorum yok:

Yorum Gönder