Gönderen Konu: Delphi de Interface Hazırlamak ve Kullanmak  (Okunma sayısı 1513 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Çevrimdışı asi kaptan

  • Deneyimli Üye
  • *
  • İleti: 332
  • Rep Gücü : 205
  • Cinsiyet: Bay
  • "Oyun bitince, şah da piyon da aynı kutuya konur''
    • Profili Görüntüle
    • İLLEGALPC
Delphi de Interface Hazırlamak ve Kullanmak
« : Ağustos 04, 2009, 01:14:32 ÖÖ »

Delphi'de Interface Hazırlamak ve Kullanmak

Interface Hazırlamak ve Kullanmak

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.


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.

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ön¬derecektir. Interface’lerde işaret edilen metotların yalnızca imzaları bulunur, metodun ne yaptığı veya işlevi hakkında bilgi olmaz.


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.

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.

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.

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;