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
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