Delphi ve Nesne Tabanlı Programlama - III
Metodlara Gönderme Yapmak
Gönderme, bir metod çağrısı ile karşılaştığında, metoda başvurulması gereken yerde, programın belirlediği yola başvurur. Metodu çağıran kod, diğer prosedür yada fonksiyon çağrılarındakine benzer. Fakat sınıfların farklı metod çağrı şekilleri vardır.
Üç tip metod çağrısı vardır:
- Static
- Virtual
- Dynamic
Siz tanımlarken başka türlü belirtmedikçe tüm metodlar statiktir. Statik metodlar, normal bir prosedür yada fonksiyon gibi çalışırlar. Derleyici, metodun tam adresini belirler ve derleme zamanında metoda bağlantı sağlar.
Statik metodların temel avantajı, bu metodlara çok hızlı gönderme yapılabilmesidir. Çünkü derleyici metodun tam adresini belirler ve doğrudan bağlantı sağlar. Virtual ve dynamic metodlar ise tam tersi olarak, çalışma zamanında metodun adresine bakarak, daha fazla zaman gerektiren, doğrudan olmayan bağlantı kullanırlar.
Static metodlar bir torun sınıftan türetildiğinde kalıtsal değişikliğe uğramazlar. Statik metod içeren bir sınıf tanımlar, sonra da bundan yeni bir sınıf türetirseniz, türetilmiş sınıf tam olarak aynı adresteki aynı metodu paylaşır. Bu static metodları ezemeyeceğiniz anlamına gelir; statik metodlar hangi sınıftan çağrıldığını umursamaksızın, herzaman aynı şeyleri yaparlar. Eğer türetilmiş sınıf içerisinde statik metod olarak aynı isimde, ata sınıftaki gibi bir metod tanımlarsanız, yeni metod türetilmiş sınıftaki kalıtsal olanın yerini kolaylıkla alır.
Bir Statik Metod Örneği
Aşağıdaki kodda ilk bileşen iki adet static metod tanımlar. İkincisi, ilk bileşenden miras kalan metodların yerini alacak, aynı isimlerde iki static metod tanımlar.
Virtual Metodlartype
TFirstComponent = class(TComponent)
procedure Move;
procedure Flash;
end;
TSecondComponent = class(TFirstComponent)
{ aynı tanımlamaya rağmen, miras kalan metoddan farklı }
procedure Move;
{ bir de bu farklı}
function Flash(HowOften: Integer): Integer;
end;
Virtual metodlar, static metodlara göre daha karmaşık ve daha esnek gönderme mekanizmasına sahiptir. Bir virtual method torun sınıfta yeniden tanımlanabilir fakat yine de ata sınıftan çağrılır. Virtual metodların adresleri derleme zamanında tanımlanmaz; bunun yerine, metodun tanımlandığı nesne adresi çalışma zamanında arar.
Virtual bir metod oluşturmak için, metod tanımına virtual direktifini ekleyin. Virtual direktifi, nesnenin virtual metod tablosunda yada VMT'de(nesne tipindeki tüm virtual metodların adreslerini tutar) bir kayıt oluşturur.
Mevcut sınıftan yeni bir sınıf tanımladığınızda, yeni sınıf ata sınıfının VMT'sindeki tüm kayıtlar ile birlikte, yeni sınıfın virtual metodlarının da bulunduğu kendi VMT'sini alır.
Metodların Ezilmesi
Metodları ezmek, bu metodu başka birisi ile değiştirmekten çok, genişletmek yada rütuş yapmak anlamına gelir.
Torun sınıfta bir metod ezmek için, metod tanımının sonuna override direktifi konulmalıdır.
Eğer;
- Metod ata sınıfta mevcut değilse.
- Aynı isimdeki ata metod static ise.
- Tanımlama özdeş metodunkinden farklı olursa(parametrelerin sayısı ve tipi farklı olursa..)
Aşağıdaki kod iki temel bileşenin tanımını içerir. İlki, herbiri farklı şekilde gönderme yapan üç metod tanımlar. Diğeri ilkinden türetilmiştir, static metodu bir başkası ile değiştirir ve virtual metodları ezer.
Dynamic Metodlartype
TFirstComponent = class(TCustomControl)
procedure Move; { static metod }
procedure Flash; virtual; { virtual metod }
procedure Beep; dynamic; { dynamic virtual metod }
end;
TSecondComponent = class(TFirstComponent)
procedure Move; { yeni metod tanımlar }
procedure Flash; override; { kalıtsal metodu ezer }
procedure Beep; override; { kalıtsal metodu ezer }
end;
Dinamik metodlar, biraz farklı gönderme mekanizması olan virtual metodlardır. Çünkü dinamik metodların nesnenin virtual metod tablosunda kayıtları yoktur, nesnelerin tükettiği hafızanın miktarını düşürebilirler. Dinamik metoda gönderme yapmak, bilinen virtual metodlara gönderme yapmaktan oldukça daha yavaştır. Metod sık sık çağrılıyorsa yada zamanın önemli olduğu uygulamalarda dynamic tanımlama yapmaktansa, muhtemelen virtual olarak tanımlamanız gerekir.
Nesneler dinamik metodlarının adreslerini saklamalıdır. Fakat virtual metod tablosundaki kayıtları almak yerine, dinamik metodlar bağımsız olarak listelenir. Dinamik metod listesi, sadece belirili sınıflar tarafından tanıtılmış yada ezilmiş metodlar için kayıtlar içerirler. (Virtual metod tablosu, farklı olarak, tüm nesnelerin kalıtsal olarak gelen ve tanıtılmış virtual metodlarını içerir.) Miras kalmış dinamik metodlara, sınıf hiyerarşi ağacı doğrultusunda geriye doğru gidilip, herbir atanın dinamik metod listesi aranarak atama yapılır.
Metodu dinamik yapmak için, dynamic direktifi metod tanımının sonuna eklenir.
Soyut Sınıf Üyeleri
Metod ata sınıfında abstract olarak tanımlandığında, herbir torun sınıfta kullanmadan önce onu yeniden tanımlayarak ve tamamlayarak kaplamanız gerekir. Delphi soyut üyeler içeren sınıfların örneklerini oluşturamaz. Sınıfın kalıtsal parçalarının kaplanması ile ilgili daha fazla bilgi için Delphi Component Writers Guide'daki özelliklerin Oluşturulması ve Metodların Oluşturulması kısımlarına bakınız.
Sınıflar ve Pointerlar
Her sınıf(ve o nedenle her bileşen de) aslında bir pointerdır. Derleyici sizin için otomatik olarak sınıf pointerları gönderir, böylece çoğu zaman bunun hakkında düşünmenize gerek kalmaz. Sınıfın pointerlar olarak durumu, bir sınıfı parametre olarak geçerken önemli olmaya başlar. Genel olarak sınıfları bir referans yerine değer olarak geçmelisiniz. Sebep şudur; sınıflar zaten referans olan pointerlardır. Sınıfı referans olarak geçmek, bir referansı referans olarak göstermekle aynı anlamdadır.
Çeviride Kullanılan Türkçe Terimler ve Karşılıkları
bileşen yazarı = component writer
bileşen = component
uygulama programcısı = application developer
ata = ancestor
nesne Yönelimli Programlama = Object Oriented Programming (OOP)
sınıf = class
torun = descendant
soyut, özet = abstract
özellik = property
metod = method
tip = type
yeniden kullanılabilirlik = reusable
VMT = Virtual Method Table
nesne = object
yayımlanmış = published
türetmek = deriving
arayüz = interface
çalışma zamanı = runtime
ezmek = override
kayıt = record
Delphi ve Nesne Tabanlı Programlama - I
Delphi ve Nesne Tabanlı Programlama - II
Borland Delphi Component Writer's Guide

