Bildiğiniz gibi VCL, .NET ortamına taşınırken derleyici bazında bir çok değişikliğe ve geliştirmeye gidildi. Bu geliştirmeler, hem Delphi.NET derleyicisini hem bildiğimiz klasik Delphi for Win32 derleyicisini etkiledi. Tabi bu geliştirmeler, en çok biz programcıların işine yaradı.
Bu makalemizde bu yeniliklere değinmeye çalışacağız. Bunlardan bir kısmını önceki makalelerimizde ayrıntılı olarak işlemiştik. Burada sadece bu sitede bahsetmediğimiz kısımlar bahsedilecek ve önceden bahsettiklerimize linkler içerecektir.
Operator Overloading:
Buradaki makalede ayrıntılı olarak işlenmiştir: http://www.diyezon.com/?p=52
Inline Belirleyicisi:
Derleyiciye tavsiye niteliğinde olan bu belirleyici (ya da direktif), fonksiyon ya da prosedürün kod çıktısında, çağrıldığı yere gömülmesini sağlar. Tavsiye niteliğinde diyorum çünkü, eğer prosedür ya da fonksiyon inline yapılmaya müsait değilse derleyici bu direktifi es geçecektir.
Inline yapılmış prosedür ya da fonksiyon, "call", "ret" gibi assembler komutlarına ihtiyacı olmadığı gibi, stack’ın push ve pop ile yedeğinin de alınmasına ihtiyaç yoktur. Çünkü inline yapılan fonksiyon, direk olarak çağrıldığı kısma yerleşecektir. Halbuki normal fonksiyonlarda call komutu ile hafızada başka bir kod kısmına dallanmaktadır. Ve burada stack’ın yedeği alınıp, fonksiyon sonunda yedek tekrar yüklenmektedir. Daha fazla bilgi için (Delphi ve C++ Builder ile Assembler ve Fonksiyon Çağırım Mekanizmaları).
Inline prosedür ve fonksiyonda bu gibi işlemler yapılmadığından kod daha hızlı çalışacaktır. Ama her fonksiyon çağırımında fonksiyon kodları direk olarak çağrıldığı yere yerleşeceğinden, programınızın boyutu biraz büyüyecektir. Tanımlaması normal fonksiyon ve prosedür gibi olup sadece son tarafa inline belirleyicisi eklenir:
procedure MyProc(x:Integer); inline;
begin
// ...
end;
Strict Private
Sınıf kavramına katılan bu alan tipi, normal private alan gibidir. Tek fark bu alan daha da gizlidir
Bu dediğimizin anlaşılabilmesi için private alanın ne olduğu bilinmesi gerek. Tabi ondan önce sınıfların ne olduğunu biliyorsunuzdur umarım(Bileşen Yazım Klavuzunun ilk bölümleri sınıfları anlatmaktadır).
Private sınıflar normalde, aynı unit içindeki başka sınıflar içinden erişilebilir. Strict Private ise gerçekten gizler. Yani aynı unit içinde bile olsa başka bir sınıf strict private alana erişemez.
Strict Protected
Private için geçerli olan durumun aynısı protected için de geçerlidir. Strict Protected ise sadece aynı sınıf ve sınıfın çocukları tarafından görülebilirler. Aynı unit bile olsa başka bir sınıf bu alanı göremez.
Metodlu Record’lar
Artık Recordlar için private, public gibi alanlar tanımlayıp procedure, function, constructor gibi metodlar tanımlayabiliyoruz. Ayrıca property’ler de tanımlanabiliyor. Yani aynı sınıflar gibi…
type
TMyRecord = record
type
TBirTip = Integer; //tip tanımlaması
var
BirAlanDegiskeni: TColor;
class var
StatikDegisken: Integer;
procedure BirProsedur();
constructor Create;
property Color: TColor read BirAlanDegiskeni write BirAlanDegiskeni;
class property StatikOzellik: TBirTip read StatikDegisken write StatikDegisken;
end;
constructor TMyRecord.Create;
begin
end;
procedure TMyRecord.BirProsedur;
begin
ShowMessage(IntToStr(Color));
end;
Abstract ve Sealed Sınıflar
Önceden abstract sınıf tanımlanamıyordu. Bunun yerine interface’ler kullanılıyordu. Ama bu her zaman işe yaramayabiliyor. Yabancı olanlar için kısaca abstract, kendisinde herhangi bir tanımlama ve kod bulunayan, kod kısmı, sınıflar için çocuk sınıflarda, metodlar için ise mirasçı metodlarda tanımlı olan bir yapıdır.
type
TAbstractClass = class abstract
procedure SomeProcedure;
end;
Bu sınıfın kod tanımlaması TAbstractClass sınıfından türeyecek olan sınıflarda yapılacaktır.
Sealed sınıflar ise, kısır sınıflardır. Yani artık sınıf hiyerarşisinde en sonda bulunan ve kendisinden herhangi bir türetme yapılamayacak olan sınıflardır.
type
TSealedClass = class sealed
procedure SomeProcedure;
end;
Bu sınıftan başka bir sınıf türetilemez.
Class Helper’lar
Buradaki makalede ayrıntılı olarak işlenmiştir: http://www.diyezon.com/?p=50
Class Statik Tipler, Değişkenler, Özellikler, Sabitler, Metodlar
Bazen olurki nesneyi tanımlamadan, sınıf içinde bulunan bazı değerlere erişilmesini istersiniz. Bu durumda erişilmesini istediğiniz şeyi, statik olarak tanımlamalısınız. Mesela aşağıdaki örneğe bakalım:
type
TAClass = class
strict private
class var
StatikDegisken: Integer;
strict protected
class function GetStatikOzellik: Integer; static;
class procedure SetStatikOzellik(val: Integer); static;
public
class property StatikOzellik: Integer read GetStatikOzellik write SetStatikOzellik;
end;
TAClass.StatikOzellik := 879;
Burada gördüğünüz gibi TAClass sınıfından bir nesne oluşturmadan içindeki bir özelliğie eriştik. Class Static tekniğini kullanırken dikkat etmeniz gerken bir kaç önemli nokta şudur:
- Statik metod’lar içinde artık Self değişkenini kullanamazsınız. Çünkü sınıfa referans içeren bir nesne yoktur.
- Statik metodlar ve özelliklerde ancak ve ancak statik olan değişken ve metodları kullanabilirsiniz.
- Statik metodları virtual ya da dynamic olarak tanımlayamazsınız.
Bunun dışında bir sınıf içinde statik sabitler ve statik tipler de oluşturulabilir:
type
TBirClass = class
private
type
TBirStatikRecord = record
BirAlan: string;
end;
public
class var
BirStatikRecord: TBirStatikRecord;
const StatikSabit = 'Burada class kelimesini kullanmanıza gerek yok!!';
end;
....
ShowMessage(TBirClass.StatikSabit);
gibi…
İç içe Geçmiş Sınıflar – Nested Classes
Artık bir sınıf tanımlamasının içinde başka bir sınıf tanımlanabiliyor:
type
TDistakiSinif = class
public
type
TIctekiSinif = class
public
procedure IctekiMetod;
end;
procedure DistakiMetod;
end;
procedure TDistakiSinif.TIctekiSinif.IctekiMetod;
begin
...
end;
Final Metodlar
Sealed sınıflar gibi final metodlar da bir sınıfın çocuk sınıflarında, final olarak tanımlanmış olan virtual metodun miras alınamadığını ifade eder. Mesela:
TSonMetodluSinif = class(TBirAtaSinif) public procedure SonMetod; override; final; end;
Bu tanımlamadan sonra artık SonMetod isimli metod, "TSonMetodluSinif" isimli sınıfın çocuk sınıfları tarafından override yapılamayacaktır. Final metodların sadece virtual metodlarda işe yaradığına dikkat edin.
For-In Döngüsü
Artık bir dizi veya kolleksiyon içinde for-in döngüsü ile iterasyon yapılabilmekte:
for DiziElemani in BirDizi do begin .... end; for BirKarakter in BirString do begin ... end; for BirKumeElemani in BirKume do begin ... end; for BirKolleksiyonElemani in BirKolleksiyon do begin ... end;
Sonuç
Yeni gelen özelliklerin unutmamış isem tamamına değinmeye çalıştım. Bunlara ek olarak Highlander çıktığında generic yani parametrize tiplere de ayrı olarak değineceğiz. Generics’in nasıl bir şey olduğunu merak edenler buraya tıklayarak meraklarını giderebilirler.
Bunlarla ilgili uygulama yapıp geliştirmek sizlere kalmış. Buradaki bilgiler önfikir mahiyetindedir. Derleyici bazındaki yenilikler bunlar olmakla birlikte, VCL ve diğer alanlarda da bir çok yeniliğe gidilmiştir. Yeri geldikçe bunlardan da bahsedebiliriz.
Yorumlarınız önemlidir, bekliyorum.

Valla makalelerinizi takip ediyorum.delphiciler
bir türlü üst sürümlere geçemediler. bende dahil. Görsel olarak Delphi7 ye alıştığımızdandır. belki de bilgisayarımız da framework istemediğimizdir. vs..Fakat diğer dillerin her geçen gün kod yazma kolaylığına, kodu basitleştirme ve kullanılabilirliği arttırma gibi nedenlerin sonucunda çıkan ek olaylar, kodlar.. işimizi rahatlatmakta.bu makalede bunlardan bazılarını gördüm. ben ne zmn foreach döngüsüde delphiye katacaklar diye düşünürken bu makele de gördüm. hoşuma gitti.ayrıca generics sınıf makalenizde çok yararlı..fakat daha bu yolda baya bi yol almaları gerekiyor. Tekrar teşekkürler ve kolay gelsin
Java Bilenler İçin.
strict private gelemeden önce private java programlama dilinde friendly diye adlandırılan erişim yöntemine benziyordu. Geriye doğru uyumluluk yüzünden private direkt olarak değiştirilemedi onun yerine saf private olduğunu belirten strict ifadesi başına getirildi.
Abstract sınıflar bildiğiniz abstract sınıflar. Her yiğidin bir yoğurt yiyişi vardır hesabı.sealed sınıflar final class tanımlamasına benzer. final metodlarda bildik şeyler. Diğerleri ise karışık kuruşuk şeyler.
Sonuç olarak şuda olsaydı dediğimiz şeylerin bir kısmı eklenmiş. Bide C# bulunan Btnclick=BtnClick Diğermetod gibi bi hadise getirseler ne kral olurdu ama
Yaw kardeş çok harika yazılar yazıyorsun. Teşekkür ederiz.
Sağolasın