Interface prosedürlerin, property’lerin ve event’ ların yapısını (bunların isimlerini, parametrelerinin nasıl aktarılacağı ve geri döndürülecek değerleri) belirler. (Terimlerin İngilizce karşılıklarını kullanmak benim de çok hoşuma gitmiyor ama anlam açıklığı için bu şekilde kullanacağım.) Interface’ler nesnenin sağlayıcısı ile onu kullanacak istemci arasındaki bir anlaşmadır aslında. Bu sayede sunucu, istemcinin belli şartları sağlamasını mecbur tutabilir. Bu sayede özellikle versiyon farklılıklarında doğacak sorunların giderilmesinde kullanılabilirler. Başka bir açıdan interface’ler şöyle yorumlanabilir. Nesnenin kullanıcıya açılan penceresidir interface. Kullanıcıya açılan pencere? Yani kullanıcıyı nesneyle etkileşime geçiren yapı. Teoriyi pratikte düşünürsek nesnenin public birimleri bir interface oluşturur. Çünkü public birimler doğrudan kullanıcıya açıktır. Bu temel interface’e native ya da primary interface adı verilir. Aynı mantıkla private birimler interface’in bir parçası değildir. Fakat altının çizilmesi gereken bir nokta; interface’ler nesnenin sunucusu ile istemcisi arasında iletişimi sağlar. Örneğin bir fonksiyonun alacağı parametre şartlarını belirler ama fonksiyonu barındırmaz. Yani interface’lerden bahsederken bizim için önemli olan birimlerimizin (sub,function,evetent..) tanımlamalarıdır.
Interface Tanımlama
Genel kabul olarak interface’lerin önüne I belirteci eklenir.
Public Interface IOrnekInterface
Event OrnEvent()
Sub OrnMethod()
Function OrnFunction(ByVal Param1 As Integer) As Integer
Property OrnProperty() As String
End Interface
Dikkat ederseniz fonksiyon ve yordamın sadece yapısı belirtiliyor.
Event’ların da interface içinde tanımladığına dikkat edin.
Bu interface’i kullanmak isteyen tüm class’lar interface’de tanımlanan birimleri karşılamak zorundadır.
Overloading
Interface içinde overloading de kullanılabilir. Örneğin;
Public Interface IOrnekInterface
Overloads Sub OrnMethod()
Overloads Sub OrnMethod(Data As String)
Overloads Function OrnFunction(ByVal Param1 As Integer) As Integer
Overloads Function OrnFunction(ByVal Param1 As Single) As Integer
End Interface
Interface’i Dahil Etme (implemantation)
Interface’i dahil etme için Implements deyimi kullanılır.
Public Class TheClass
Implements IOrnInterface
End Class
Vb’daki interface kullanımındaki bulanıklıklar Vb.NET ile giderilmiş durumda. Herhangi bir metodu bir interface’in belli bir metodunu karşılayacağını aşağıdaki şekilde belirtiyoruz.
Public Sub OrnMethod() Implements IOrnInterface.OrnMethod
Yukardaki örnekteki interface’i (IOrnekInterface’i) kullanmak istersek, interface’in şart koştuğu yapıyı desteklemek zorundayız. Örneğin;
Public Class TheClass
Implements IOrnInterface
Public Event OrnEvent() Implements IOrnInterface.OrnEvent
Public Function OrnFunction(ByVal Param1 As Integer) _
As System.Integer Implements ornek.IOrnInterface.OrnFunction
End Function
Public Sub OrnMethod() Implements ornek.IOrnInterface.OrnMethod
End Sub
Public Property OrnProperty() As String _
Implements ornek.IOrnInterface.OrnProperty
Get
End Get
Set
End Set
End Property
End Class
Interface’in şart koştuğu tüm birimlerin karşılandığına dikkat edin.
Şu aşamadan sonra nesnenin native interface’ini değil de IOrnInterface’ini kullanabiliriz. Bu işlemi yapacak istemci için örnek;
Dim obj As IOrnInterface
obj = New Implementer()
obj.OrnMethod
VB.NET ile interface’i karşılayacak metodun ismi ve etki alanı (scope) , interface’in karşılanacak olan metodundan bağımsız hale gelmiştir.
Çoklu Interface kullanımı (multiple interface)
Bir sınıf birden fazla implements deyimi kullanarak birden fazla interface dahil edebilir. Aşağıdaki gibi interface’lerimizin olduğunu düşünelim;
Public Interface IBirinciInterface
Sub Islem1()
End Interface
Public Interface IIkinciInterface
Sub Islem2()
End Interface
Bu iki interface’i de kendi içine dahil eden bir sınıf oluşturabiliriz;
Public Class TheClass
Implements IBirinciInterface
Implements IIkinciInterface
End Class
Şu halde iki seçenek karşımıza çıkıyor. Birincisi Islem1 ve Islem2’i karşılayacak iki farklı yordam oluşurmak.
Private Sub IsimOnemsiz1() Implements IBirinciInterface.Islem1
‘ Gerekli kodlar
End Sub
Private Overloads Sub IsimOnemsiz2 () Implements IIkinciInterface.Islem2
‘ Gerekli kodlar
End Sub
İkincisi eğer aynı Islem1 ve Islem2 aynı işi gerçekleştiriyorsa ikisini tek seferde karşılamak;
Private Sub Islem() _
Implements IBirinciInterface.Islem1, IkinciInterface.Islem2
‘ Gerekli kodlar
End Sub
