gece krallığı (şimdiye kadar 41 posta) | | 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:
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:
type
IArayuz = Interface(IUnknown)
End;
Kod:
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:
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:
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:
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:
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; |