Ana içeriğe atla

Interfaceler - 2

interfaceler ve guid arasındaki ilişkinin ne olduğunu anlamaya çalışırken yardımımıza yine marco cantu amcamız koşarak geldi ve bize güzel ipuçları verdi. delphi 7 kitabındaki interfacler bölümünden bir notu aktarıyorum buraya.
Her ne kadar interfacler bir GUID belirtmeden derleyerek kullanabilseniz de genellikle bunu yapmamanız gerekir. Çünkü QueryInterface işleminin gerçekleştirilebilmesi ve bu interface tipi kullanılarak dinamik "as" tip atamalarının yapılabilmesi için bu şarttır. Interfacelerin (genellikle) tek amaçları çalışma zamanında büyük oranda artırılmış tip esnekliğinden faydalanmak olduğu için sınıf tipleriyle karşılaştırıldılarında GUID sahibi olmayan arabirimler pek işe yaramaz.
Kısaca queryinterface işlemini kullanabimek veya "as" ifadesini çalışma zamanın da kullanabilmek istiyorsak guidleri kullanmamaız lazım. Aşağıdaki gibi iki adet interface tanımlıyorum ve bunlardan bi tanesine guid numarası veriyorum diğerine vermiyorum.

IKus=interface(iinterface)
['{2B67EB54-6856-411A-B331-203FC6987574}']
{ procedure Uc;
end;

IFutbol = interface(iinterface)
procedure TakimAdi;
end;

her iki interfaceide kullanan iki tane sınıf tanımlıyorun.

tkanarya = class(TInterfacedObject,iKus,ifutbol)
procedure uc;
procedure TakimAdi;
end;

tkartal = class(TInterfacedObject,iKus,ifutbol)
procedure uc;
procedure TakimAdi;
end;
bu sınıfların gövdelerini ise aşağıdaki gibi tanımladım.

{ tkanarya }

procedure tkanarya.TakimAdi;
begin
ShowMessage('kestane :)');
end;

procedure tkanarya.uc;
begin
ShowMessage('uç kanarya');
end;

{ tkartal }

procedure tkartal.TakimAdi;
begin
ShowMessage('beşikaş');
end;

procedure tkartal.uc;
begin
ShowMessage('uç kartal');
end;
button1 in kodları ise şu şekilde

procedure TForm1.Button1Click(Sender: TObject);
var
kus:IKus;
futbol:IFutbol;
kartal:tkartal;
begin

kartal := tkartal.Create;
kus := kartal as ikus; // bu satır başarılı bir şekilde derleniyor
// futbol := kartal as ifutbol; //delphi bu satırı derlemeyi
// kibarca reddediyor.
futbol := kartal; //anlamadığım nokta bu. bu satır geçerli bi satır :)

if kus.QueryInterface(StringToGUID('{2B67EB54-6856-411A-B331-203FC6987574}'),
kartal) = s_ok then 
ShowMessage('destekliyor')
else
ShowMessage('desteklemiyor');
kus.Uc;
//guid belirtirsek bu if ifadesi düzgün çalışıyor. aksi takdirde 
//çalışmıyor...

end;
bu şekilde "as" ifadelerini nerde kullanıyoruz diye düşündüğümde aklıma ilk gelen örnekler aşağıdakiler gibi. doc := WebBrowser.Document as IHTMLDocument2; Range := ((WB.Document AS IHTMLDocument2).body AS IHTMLBodyElement).createTextRange; -kafamdaki soru işaretlerini tam olarak gidermesede- interfacelere guid numaraları vermekteki maksat bu şekilde ki ifadelerin çalışabilmesini sağlamak.

Yorumlar

Sadettin POLAT dedi ki…
bu arada ben cimbomluyum :)
bizim takımı böyle şeylere alet etmiyim dedim bi de biz kuş familyasından değiliz
aslan.kukre yazdim hatali interface dedi. :)

bu kus gribinden kanarya ve kartalin da nasibini bir an once almalarini diliyorum
Adsız dedi ki…
hoşçakal sadettin ..

Bu blogdaki popüler yayınlar

Yazılımı Oluşturan Bileşenler Nelerdir?

Yazılımı oluşturan bileşenlerden daha önce söz etmiştik. Şimdi bu bileşenlerin neler oldukları üzerinde biraz duralım. Yazılımı oluşturan bileşenler = Mantık + Veri + Belge + İnsan + Program. Bu bileşenlerin az çok neler olduğunu, neleri kapsadığını biliyoruz ama biz yine de kıyısından köşesinden açıklayalım. Zaten bu yazıdaki asıl amaç yazılım bileşenlerinden belgelemenin yerini ve önemi (dökümantasyon) vurgulamak. Mantık = Yazılım herşeyden önce bir işin bilgisayar aracılığı ile yapılması amacına yöneliktir. Bu nedenle bilgisayarlaştırılmak istenen işin mevcut mantığı bir şekilde yazılıma da yansılıtılmak zorundadır. Veri = Her tür yazılım mutlaka bir veri üzerinde çalışmak durumundadır. Veri işlemeyen yazılımın geliştirilmesi söz konusu değildir. Söz konusu olan veri dış ortamdan alınabileceği gibi yazılımın içerisinde de üretilebilir. Zaten yazılımın temel amacı veriyi bilgiye dönüştürmektir. İnsan = Doğal olarak yazılımın insan bileşeni iki boyutludur. Yazıl

Leyse li'l-insâni illâ mâ seâ

"Leyse li'l-insâni illâ mâ seâ" derken Hudâ; Anlamam hiç meskenetten sen ne beklersin daha? Mehmet Akif Ersoy / Durmayalim Leyse li'l-insâni illâ mâ seâ : Necm Süresi 39. Ayet. [İnsan için ancak çalıştığı vardır.] Meskenet: 1 . Miskinlik, beceriksizlik. 2 . Yoksulluk, fakirlik. (Türk Dil Kurumu) Olay zaten yeterince acik. Yan gelip yatma kardesim. Calis. Bu misralar yazildigi donemde bu anlami tasiyordu fakat zaman ilerledikce baska bir gercegi de gozler onune seriyor.Gerci bu gercek cok kapsamli bir kac satirla anlatilabilecek bir sey degil kaldiki benim bilgim de buna yeterli degil zaten. Ben giris cumlelerini verebilirim gerisini arastirmak yaziyi okuyanlara kalmis. (Matrix gibi bisey oldu bu yaw. Neo'nun kahinle bulusup yanindan ayrildiktan sonra Morpheus ile konusma sahnesi.) Yani kisaca sunu demek istiyorum. Ben bu misrayi ilk okudugumda hic birsey anlamadim. Bu misralari anlayabilmek icin kuran mealine ve turkce sozluklere bakmak zorunda k

Yunus sen bu dünyaya niye geldin?

Göçtü Kervan Ah nice bir uyursun uyanmaz mısın Göçtü kervan kaldık dağlar başında Çağrışı tellallar inanmaz mısın Göçtü kervan kaldık dağlar başında Emr-i hac göçeli hayli zamandır Muhammed cümleye dindir imandır Delilsiz gidilmez yollar yamandır Göçtü kervan kaldık dağlar başında Yunus sen bu dünyaya niye geldin Gece gündüz Hakkı zikretsin dilin Enbiyaya uğramaz ise yolun Göçtü kervan kaldık dağlar başında Yunus Emre