Generic nedir ne ise yarar ?
Delphi Highlander surumu ile Delphi for .Net* icin dile eklenen Generic ozelligi artik Win32 icinde mevcut.

Genericler kisaca bazi durumlarda fazladan kod yazmamizin onune gecip bakimi , gelistirmesi daha kolay olan kodlar yazmamiza olanak sagliyorlar. Ornek vermek gerekirse hem integer hem de string veri tipinde elemanlar saklamak istediginiz bir listeye ihtiyaciniz olsun. Genericler olmadan bu isi kotarabilmenizin elbet degisik bir kac yolu mevcut. Mesela listeye eleman eklediginiz metodun hem integer tipindeki verileri kabul eden hem de string tipindeki verileri kabul eden iki farkli metodunu tanimlar ve bunlari da overload olarak isaretlerseniz hedefinize ulasmis olursunuz ya da tip cevrimleriyle ugrasmak istemiyorsaniz ayri ayri siniflar tanimlayarak siniflardan birinde integer veri tiplerini digerinde ise string veri tiplerini saklayabilirsiniz. Iste genericler bu tur durumlarda bizi taklalar atmaktan kurtarip bizim yerimize compilerin takla atmasini sagliyor. Sakladiklari veri tipleri haricinde hicbir farkliligi mevcut olmayan bu iki sinifi ayri ayri tanimlamak biz programcilar icin bosuna zaman kaybina neden oluyor. Genericler ise bu zaman kaybinin onune geciyor. Nasil ki prosedur ve fonksiyonlara duruma gore degisik parametreler degisik sonuclar elde ediyorsak genericler ile birlikte artik sinif tanimlarina da bazi parametreler ekleyip tek bir sinif tanimini farkli veri tipleriyle kullanmamiz artik mumkun.

basit bir ornek vermek gerekirse hem integer tipi ile hem de string veri tipi ile (aslinda butun tiplerle :) ) uyumlu calisabilecek bir sinif tanimlayalim.


TGenericSinifim<T> = Class
  private
    FEleman: T;
    procedure SetEleman(const Value: T);
  protected
  public
  property Eleman:T read FEleman write SetEleman;
End;

...
...

procedure TGenericSinifim<T>.SetEleman(const Value: T);
begin
  FEleman := Value;
end;

sinifimizi tanimladik simdi de nasil kullanacagimizi gorelim.


procedure TForm2.Button1Click(Sender: TObject);
var
IntegerEleman:TGenericSinifim<Integer>;
StringEleman:TGenericSinifim<String>;
TButtonEleman:TGenericSinifim<TButton>;
begin

 IntegerEleman :=TGenericSinifim<Integer>.create;
 StringEleman:=TGenericSinifim<String>.create;
 TButtonEleman:=TGenericSinifim<TButton>.create;

 IntegerEleman.Eleman :=53;
 StringEleman.Eleman :='string';
 TButtonEleman.Eleman :=button1;

 FreeAndNil(IntegerEleman);
 FreeAndNil(StringEleman);
 FreeAndNil(TButtonEleman);
end;

yukarida gordugunuz gibi ayni sinifin ayni ozelligine tip cevrimlerine gerek kalmadan , taklalar atmadan kolaylikla degisik tiplerde veriler atadik. IntegerEleman yazip noktaya bastiginizda acilan kod tamamlama penceresine dikkat ederseniz delphi size calismakta oldugunuz generic tipin eleman ozelligine atamaniz gereken degisken tipinide gosterecektir.

İşin sirri olinde
Bu genericlerin tam olarak calisma sekilleri ise su sekildedir. Siz bir generic sinif tanimladiginizda ve bu siniflara veri turlerini atayarak bir degisken tanimlamasi yaptiginizda derleyici derleme sirasinda kod icerisinde kullanmis oldugunuz her degisik tipte ki generic sinif icin otomatik olarak bir sinif tanimlar. Zaten isin puf noktasida burasidir. Eskiden bizim yaptigimiz olayi artik derleyici kendisi yapmaktadir. Bunu daha iyi anlayabilmek icin yukaridaki nesnelerin calisma zamanindaki class isimlerini ekrana yazdiralim.

Genericlerin Kullanim sekilleri ve tanimlanmasi


TGenericClass<Tip1>Class

TGenericClass<Tip1,Tip2>Class

Başka bir siniftan türetirken


 TFoo1<T> = class(TBar)            // Actual type
  end;

  TFoo2<T> =  class(TBar2<T>)       // Open constructed type
   end;

  TFoo3<T> = class(TBar3<Integer>)  // Closed constructed type
  end;

Class, Interface, ve Recordlarda


type
      TRecord<T> = record
      FData: T;
      end;

      type
      IAncestor<T> = interface
      function GetRecord: TRecord<T>;
      end;
      IFoo<T> = interface(IAncestor<T>)
      procedure AMethod(Param: T);
      end;

      type
      TFoo<T> = class(TObject, IFoo<T>)
      FField: TRecord<T>;
      procedure AMethod(Param: T);
      function GetRecord: TRecord<T>;
      end;

Procedural tiplerde


      TMyProc<T> = procedure(Param: T);
      TMyProc2<Y> = procedure(Param1, Param2: Y) of object;

type
  TFoo<T: ISerializable> = class
    FField: T;
  end;

...........

type
   TFoo<T: ISerializable; V: IComparable>

..........

type
   TFoo<S, U: ISerializable> ...

..........

type
   TFoo<T: ISerializable, ICloneable; V: IComparable> ...

..........

  TFoo<T: TObject> = class
  TFoo2<T: TFoo> = class

Delphi ile hazir gelen generic siniflar…
Vcl beraberinde Generics.Collections adli yeni bir unitle geliyor ve bu unitin icerisinde kullanima hazir bazi generic siniflar yer aliyor. Bunlar TList , TQueue , TStack , TDictionary , TObjectList , TObjectQueue , TObjectStack , TObjectDictionary

Genericler hakkinda detayli bilgi icin bu uniti incelemenizi siddetle tavsiye ederim.

*Codegear vcl.net icin koklu degisiklikler yapmaya hazirlaniyor. mevcut ide ile .net dunyasi icin gelistirilen 3. parti desteginden yoksun kaldigini dusunen codegear delphi for .neti supriz yapip visual studio icine tasirsa -ki Java Builderi ayni nedenlerden oturu yakin bir zamanda Eclipse uzerine tasimislardi- fazla sasirmayin.

One Response to “Tiburón yeniliklerine devam ediyoruz-2 (Generics for Win32)”
  1. Delphi Peak » Arka sokaklarda neler oluyor ? says:

    [...] Burdaki yazimizin son bolumune CodeGear ‘in Delphi For .Net in gidisatindan pek memnun olmadigi icin radikal bazi degisikliklere gidecegini not dusmustuk hatirlarsaniz. CodeGear Urun Gelistirme ve Strateji Bolumu Baskani Michael Swindell ‘ in bazi bloglarda .Net hakkinda ki bir takim planlarindan bahsetmesi ortaligi alevlendirdi ve gelistirici bloglarindan Delphi for .Net spekulasyonlari ardi ardina gelmeye basladi. Akabinde Delphi Urun Yoneticisi Nick Hodges ‘ in .Net ile ilgili olarak yaptigi bir takim aciklamalar ile ortalik hepten bulanirken Data Abstract , RemObjects SDK , Hydra , AnyDac , Pascal Script ve .Net ve Mono icin gelistirdikleri Oxygene adli compiler ile adindan soz ettiren Rem Object firmasinin kurucularindan Marc Hoffman, blogunda yazdigi 3 cumle bazi seylerin netlesmesini sagladi. “Kagitlar imzalandi , Oyun yeniden baslasin” ifadesi CodeGear ile Rem Object firmasinin arasindaki bir anlasmanin varligini acikca gosteriyor. Bu anlasmanin odak noktasinda Oxygene adli urunun oldugu ise cok net. [...]

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>