Makale Özeti

"VB.NET biliyorum C# da öğrenmek istiyorum." diyenler için bir makale dizisi.

Makale

VB.NET 'den C#'a - 10

Interface

VB.NET'de Interface tanımlama işlemi Interface/End Interface tanımlamaları arasında yapılır. Bir sınıfın bir interface'i uygulaması için  implements anahtar kelimesi kullanılır.

    Public Interface IDBProvider

        Sub SaveEmployee(ByVal Emp As Employee)

        Function GetEmployee(ByVal EmpID As Integer) As Employee

        Sub DeleteEmployee(ByVal empID As Integer)

    End Interface

 

    Public Class SQLDBProvider

        Implements IDBProvider

        Public Sub DeleteEmployee(ByVal empID As Integer) Implements IDBProvider.DeleteEmployee

 

        End Sub

 

        Public Function GetEmployee(ByVal EmpID As Integer) As Employee Implements IDBProvider.GetEmployee

 

        End Function

 

        Public Sub SaveEmployee(ByVal Emp As Employee) Implements IDBProvider.SaveEmployee

 

        End Sub

    End Class

    Public Class Employee

        'örnek amacıyla eklendi

    End Class

Yukarıdaki kod bloğunda IDBProvider adında ve SaveEmployee, GetEmployee, DeleteEmployee metodlarını içeren bir interface tanımlaması gözükmektedir. SQLDBProvider sınıfı ise bu arayüzü Implements ifadesi ile uygulamaktadır. Sınıfın içindeki metodların arayüzde tanımlanan metodlar için tanımlandığını belirleyen unsur, metodların sonundaki Implements ifadeleridir. Interface ile metod dışında property ve event gibi sınıf üyeleride tanımlanabilir. Field tanımlanamaz.

        public interface IDBProvider

        {

            void SaveEmployee(Employee Emp);

            Employee GetEmployee(int EmpID);

            void DeleteEmployee(int EmpID);

        }

        public class SQLDBProvider:IDBProvider

        {

            public void SaveEmployee(Employee Emp)

            {}

            public Employee GetEmployee(int EmpID)

            {return new Employee();}

            public void DeleteEmployee(int EmpID)

            {}

        }

        public class Employee{}

C#'da bir interface'i implemente eden bir sınıf interface'de tanımlanan metodları tanımlarken, aynı isim, aynı imza,, ve public olmasına ve static olmamasına dikkat ederek metod tanımlamasını yazmalıdır.

Bir interface diğer interface'den miras alabilir. Bir sınıf ancak bir sınıfdan miras alabilir, ancak bir sınıf birden fazla interface'i implemente edebilir.

Bir interface'in başka bir interface'den miras alması

VB.NET

    Public Interface Arayuz1

        Sub metod1()

    End Interface

    Public Interface Arayuz2

        Inherits Arayuz1

        Sub metod2()

    End Interface

    Public Class class1

        Implements Arayuz2

        Public Sub metod1() Implements Arayuz1.metod1

        End Sub

        Public Sub metod2() Implements Arayuz2.metod2

        End Sub

    End Class

C#

        public interface arayuz1

        {

            void metod1();

        }

        public interface arayuz2:arayuz1

        {

            void metod2();

        }

        public class class1:arayuz2

        {

            public void metod1(){}

            public void metod2(){}

        }

Bir sınıfın iki interface'i implemente etmesi

Bir sınıf birden fazla interface'i implemente edebilir.Burada üzerinde durulması gereken nokta iki interface'de de aynı isimde üye var ise ne olacağıdır.

VB.NET

    Public Interface Arayuz3

        Sub SaveWorld()

    End Interface

    Public Interface Arayuz4

        Sub SaveWorld()

    End Interface

Yukarıdaki kod bloğunda aynı metoda (SaveWorld) sahip iki arayuz tanımlanmıştır. Bunları bir sınıfın implemente etmesi için sınıf içerisinde iki kere implements ifadesi kullanılabileceği gibi interface isimleri virgülle ayrılarak yazılabilirler.

    Public Class class2

        Implements Arayuz3

        Implements Arayuz4

        Public Sub SaveWorld() Implements Arayuz3.SaveWorld

        End Sub

        Public Sub SaveWorld1() Implements Arayuz4.SaveWorld

        End Sub

    End Class

Implements ifadesini bir kere yazıp interface'leri virgül ile ayırmakda mümkündür.

    Public Class class2

        Implements Arayuz3, Arayuz4

        Public Sub SaveWorld() Implements Arayuz3.SaveWorld

            MessageBox.Show("Arayuz3.SaveWorld - class2.SaveWorld")

        End Sub

        Public Sub SaveWorld1() Implements Arayuz4.SaveWorld

            MessageBox.Show("Arayuz4.SaveWorld - class2.SaveWorld1")

        End Sub

    End Class

Kalın olarak belirlenmiş bölümlere dikkat edilir ise sınıf içerisinde aynı isimde ve imzada birden fazla metod olamayacağı için Arayuz3 tarafından uygulattırılan SaveWorld  metodu için aynı isimde bir metod oluşturulmuştur. Arayuz4 ile uygulattırılan SaveWorld için ise herhangi bir tercih ile SaveWorld1 ismi verilmiştir.(Visual Studio.NET bu şekilde isimledirir. Ancak burada mühim olan Implements Arayuz.... şeklinde metodan sonra yazılan ifadelerdir.

Yukarıdaki kod bloğunda oluşturulan class2 sınıfını aşağıdaki kod bloğunu ile test edebiliriz.

        Dim c2 As New class2

        c2.SaveWorld()  'Arayuz3.SaveWorld-class2.SaveWorld

        c2.SaveWorld1() 'Arayuz4.SaveWorld-class2.SaveWorld1

        Dim a3 As Arayuz3 = c2

        a3.SaveWorld() 'Arayuz3.SaveWorld-class2.SaveWorld

        Dim a4 As Arayuz4 = c2

        a4.SaveWorld() 'Arayuz4.SaveWorld-class2.SaveWorld1

Kod bloğu çalıştırıldığında sonuç olarak dört defa mesaj kutusu görüntülenecektir. Mesaj kutularında sırası ile aşağıdaki metinler yer alacaktır.

  1. Arayuz3.SaveWorld - class2.SaveWorld

  2. Arayuz4.SaveWorld - class2.SaveWorld1
  3. Arayuz3.SaveWorld - class2.SaveWorld

  4. Arayuz4.SaveWorld - class2.SaveWorld1

C#

C#'da bir sınıf iki interface'i implemente ettiği zaman, eğer iki interface'de de aynı metod tanımlamaları var ise, bu metodlara erişim denetleyici olarka public verilmez. Bu metodlar sınıf türünden bir değişken ile değil arayuz türünden bir değişken ile erişilebilir olurlar.

        public interface arayuz3

        {

            void SaveWorld();

        }

        public interface arayuz4

        {

            void SaveWorld();

        }

        public class class2:arayuz3,arayuz4

        {

            void arayuz3.SaveWorld()

            {MessageBox.Show("arayuz3.SaveWorld");}

            void arayuz4.SaveWorld()

            {MessageBox.Show("arayuz4.SaveWorld");}

        }

Aynı isime sahip iki metodu interfaceler dolayısıyla uygularken metodlara erişim denetleyici olarak public veremeyiz. Bu durumda bu metodlar private olarak çalışır. Yani aşağıdaki şekilde gözüktüğü gibi sınıftan türettiğimiz bir nesnenin metodlarına sınıf türünde bir değişken üzerinden erişemeyiz.

Aşağıda gözüktüğü gibi metodlara ancak interface'ler türünde değişkenler üzerinden erişebiliriz.

    class2 c2=new class2();

    arayuz3 a3=c2;

    arayuz4 a4=c2;

    a3.SaveWorld();

    a4.SaveWorld();

Yukarıdaki kod bloğu ile oluşurduğumuz sınıfın test ettiğimizde sonuç olarak iki mesaj kutusu ile karşılaşırız. Birinci mesaj kutusu arayuz3.SaveWorld metnini ikincisi ise arayuz4.SaveWorld metnini görüntüleyecektir.

Eğer senaryonuz uygun ise VB.NET ile iki interface tarafında da uygulattırılan metodları tek bir metod olarak tanımlayabilirsiniz. Çok elzem bir özellik olmasa da bu durum C# için geçerli değidir.

    Public Class class3

        Implements Arayuz3, Arayuz4

        Public Sub SaveWorld() Implements Arayuz3.SaveWorld, Arayuz4.SaveWorld

        End Sub

    End Class

Cengiz HAN
Microsoft ASP.NET MVP
cengiz@cengizhan.com