Delphi'de Interface Hazırlamak ve Kullanmak

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
memiky
Üye
Mesajlar: 116
Kayıt: 17 Kas 2004 01:52
İletişim:

Delphi'de Interface Hazırlamak ve Kullanmak

Mesaj gönderen memiky »

Delphi’de Interface Hazırlamak ve Kullanmak

Delphi konulu kaynaklarda en az sözü edilen konulardan birisi Interface'lerdir. Interface'lerin Delphi'de nasıl hazırlanıp kullanıdığı konusunda ön bilgi vermek için Delphi 2007 for Win32 kitabımın 2 sayfasını buraya aldım.

Değişik programcılar tarafından geliştirilen Class’lar farklı işlemleri yapıyor olsalar bile bazı ortak noktalara sahip olabilirler. Örneğin her Class’ın sıralama yapan bir metoda veya “Firma” adına sahip bir özelliğe sahip olması istenebilir. Bu gibi sorunların çözümü Interface hazırlamaktan geçiyor. Interface’lerde metot imzaları olmaktadır.

Bu konuda teknik bilgi vermek yerine hemen basit bir örnek yapacağım. Bu amaçla üzerinde çalıştığım projedeki ilk formu temsil eden Class’ın yer aldığı kod dosyasında aşağıdaki gibi “TMatematik” adında bir class ve “IArayuz” adında bir Interface hazırladım. Form1 temsil eden Class’ın Click() metodunda ise matematik class’ının örneğini hazırladım.

Kod: Tümünü seç

type
  TForm1 = class(TForm)
    procedure FormClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
Type
    IArayuz = Interface(IUnknown)
 End;
Type
     TMatematik = class(TObject)
  End;

Var
   Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormClick(Sender: TObject);
 Var
    Nesne : TMatematik; 
 begin
    Nesne := TMatematik.Create;
 end;
end.  
Nasıl ki class’lar “class” anahtar kelimesi ile başlıyorsa Interface’ler ise Interface anahtar kelimesi ile başlamaktadır. Genel alışkanlıkla Interface’lerin adlarının başına “I” harfi konulmaktadır. Nasıl ki Delphi’de bu sınıflar TObject sınıfından türetiliyorsa Interface’ler de IUnknown adlı Interface’den türetilmektedir. Interface anahtar kelimesine herhangi bir Interface adı yazılmazsa bunun IUnknown olduğu varsayılır.

Bu şartlarda TMatematik adını verdiğim Class’a bu arayüz uygulansa bile değişen bir şey olmaz. Çünkü IArayuz adını verdiğim Interface herhangi bir olay, metot veya özelliğe sahip değildir. Interface’lerin Class’lara nasıl uygulandığını aşağıda görebilirsiniz.

Kod: Tümünü seç

type
   IArayuz = Interface(IUnknown)
End;

type
   TMatematik = class(TInterfacedObject, IArayuz)
End; 
Şimdi bu Interface’in bir metoda sahip olmasını sahip olmasını sağlayacağım. “Topla” adını verdiğim metot integer tipinde 2 parametreye sahip olacak ve geriye yine integer bilgi gönderecektir. Interface’lerde işaret edilen metotların yalnızca imzaları bulunur, metodun ne yaptığı veya işlevi hakkında bilgi olmaz.

Kod: Tümünü seç

type
  IArayuz = Interface(IUnknown)
  Function Topla(X, Y : Integer): Integer;
End; 
Bu şartlarda proje çalıştırılırsa hata meydana gelir. Çünkü bu arayüzü uygulayan “TMatematik” adlı Class’ın “Topla” adında ve integer tipinde 2 parametreye sahip bir metodu olması gerekir. Bu düşünce ile “TMatematik” Class’ını aşağıdaki gibi düzenledim.

Kod: Tümünü seç

type
  TMatematik = class(TInterfacedObject, IArayuz)
   Function Topla(Sayi1, Sayi2 : Integer): Integer;
End;
implementation
function TMatematik.Topla(Sayi1, Sayi2: Integer): Integer;
begin
    Topla := Sayi1 + Sayi2;
end; 
Bu şartlarda uygulama çalıştırılırsa hata meydana gelmez. Çünkü “TMatematik” Class’ı uyguladığı Interface’in gereklerini yerine getirmiş oldu. Bu Class’ta Topla() metodunun parametre olarak aldığı bilgileri toplayıp geriye göndermesini sağladım. Başka bir sınıfta ise metot dahilinde yapılan işlem farklı olabilir. Tekrar etmek gerekirse Interface’ler yalnızca metotların adları, geriye gönderdikleri bilginin türü ve parametrelerinin sayısı ve tipiyle ilgilenirler. Bunu göstermek bu arayüzü uygulayan ikinci bir Class hazırladım. Bu Class’ta Topla() metoduna farklı bir işlem yaptırdım.

Kod: Tümünü seç

type
  TDeneme = class(TInterfacedObject, IArayuz)
  Function Topla(Sayi1, Sayi2 : Integer): Integer;
End;
implementation
function TMatematik.Topla(Sayi1, Sayi2: Integer): Integer;
begin
    Topla := Sayi1 + Sayi2;
end;
function TDeneme.Topla(Sayi1, Sayi2: Integer): Integer;
Var
  X, Y : Integer;
begin
   X := Sayi1 * Sayi1;
   Y := Sayi2 * Sayi2;
   Topla := X + Y;
end; 
Bu metot farklı bir işlem yapsa bile Interface’in gereklerini yerine getirmektedir. Yukarıda Interface hazırlarken IUnknown adlı standart Interface’i mirasçı olarak seçtim. Hazırlamak istediğiniz Interface mevcut bir Interface miras olarak alabilir. Aşağıda verilen örnek Interface uygulayan Class’ların 3 metoda sahip olmaları gerekir.

Kod: Tümünü seç

type
  IIslemler = Interface(IUnknown)
  Function Bolme(X, Y : Integer): Integer;
  Function Carpma(X, Y : Integer): Integer;
End;
type
  IArayuz = Interface(IIslemler)
  Function Topla(X, Y : Integer): Integer;
End;
type
  TMatematik = class(TInterfacedObject, IArayuz)
  Function Topla(Sayi1, Sayi2 : Integer): Integer;
  Function Bolme(Sayi1, Sayi2 : Integer): Integer;
  Function Carpma(Sayi1, Sayi2 : Integer): Integer;
End;
ibrahimcoban
Üye
Mesajlar: 163
Kayıt: 11 Eki 2005 10:44
İletişim:

Mesaj gönderen ibrahimcoban »

Sizce Delphi 2007' e geçmeye değer mi ?
memiky
Üye
Mesajlar: 116
Kayıt: 17 Kas 2004 01:52
İletişim:

Mesaj gönderen memiky »

Kişisel görüşüme göre Delphi 2007 for Win32'nin piyasaya verilmesinin en büyük nedeni firma ve/veya firma adı değişikliği. Zaten Delphi 2007, Delphi 2006 veya Turbo Delphi'den pek farklı değil.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

ibrahimcoban yazdı:Sizce Delphi 2007' e geçmeye değer mi ?
sırf interfaceler içinse değmez çünkü interfaceler eskiden beri var.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
fatihtolgaata
Üye
Mesajlar: 382
Kayıt: 04 Mar 2004 09:46
Konum: K.çekmece / İstanbul
İletişim:

Mesaj gönderen fatihtolgaata »

Hocam çok teşekkürler. Faydalı bir makale olmuş.
ibrahimcoban yazdı:Sizce Delphi 2007' e geçmeye değer mi ?
Eğer Vista için kendin kod yazmak istemiyorsan delphi 2007'ye geçebilirsin. Ama bunun için çok falza kod yazmak gerekmiyor. Bence Highlander sürümünü beklemelisin upgrade için. .Net 2.0, Generics yanında, son roadmap'e göre ayrıca 3.0 kodları da çalıştırılabilecek preview olarak. Ekim, Kasım aylarını beklemek gerekecek.
Kullanıcı avatarı
MicroChip
Kıdemli Üye
Mesajlar: 1119
Kayıt: 02 Ağu 2003 01:02
Konum: İstanbul
İletişim:

Mesaj gönderen MicroChip »

Teknolojileri takip etmek ne kadar zor. (Komple olarak yani donanım,yazılım)
Kafkas Kartalı Kabarday
Sitesi!= http://www.ahmetceylan.com
Resim
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3077
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

viewtopic.php?p=97806#97806

Aslında arabirimler derin bir konu. Tıpkı nesne programlama gibi ama benim en çok dikkatimi çeken özellik yukarıda verdiğim linkte var. (Support fonksiyonu ile arabirimlerin elde edilip metotlarının çalıştırılması)
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Cevapla