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.
Kod Çizelgesi Kod Dili: php
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 Çizelgesi Kod Dili: php
type
IArayuz = Interface(IUnknown)
End;
Kod Çizelgesi Kod Dili: php
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.
Kod Çizelgesi Kod Dili: php
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 Çizelgesi Kod Dili: php
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 Çizelgesi Kod Dili: php
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 Çizelgesi Kod Dili: php
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;