C# ile Interface Kullanımı (Arayüz) Nedir? Nasıl Kullanılır? Örnek Anlatımlı

Bu makalemde yine Object Oriented bileşenlerinden olan Interface (Arayüz) kullanımını anlatacağım.

Öncelikle Interface, Türkçe anlamı “Arayüz” olan, ve diğer class lara Rehberlik görevi üstlenen bir yapımızdır. Burada Rehberlik kavramına dikkat çekerim. Yani gerçekten yaptığı iş sadece diğer classlara yön göstermektir. Bu yüzden Interface tanımları içerisinde kesinlikle kod bloğumuz bulunmaz. Interface yapılar sadece tanımlamalardan ibarettir, içerisinde hiçbir yapıcı metod ekleyemeyiz.

Interface i diğer classlardan ayıran birçok özellik vardır. Bunlara birazdan değineceğim.

Ama en önemlisi:

* Bir Class sadece bir class tan türetebilirken, bir Class birden çok Interface ten türetilebilir.

Yani, bir Classa birden çok Interface ile rehberlik edebiliriz.

Şimdi bir örnek ile Interface kavramına giriş yapalım.

public interface IBasliklar

{

string Isim();

string AnaBaslik();

string AltBaslik();

string Yazdir();

}

public interface IUzunluk

{

string En();

string Boy();

string Kalinlik();

string Yazdir();

}

Class oluştururken nasıl “Class” parametresi kullanıyorsak, Interface oluştururken de “Interface” anahtar sözcüğünü kullanırız.

Oluşturduğumuz Interface isimlerinin, I ile başladığına dikkat çekerim. Bu bize kalıtım aldığımız calss ta, kalıtım alınan şeyin bir Interface olduğunu gösterir.

Interface oluştururken dikkat edeceğimiz maddeler aşağıda ki gibidir:

  • Interface ler yukarda bahsettiğim gibi Rehber görevi görürler. Yani içerisine herhangi bir kod parçası ekleyemeyiz. Sadece tnaımlama yaparız.
  • Bir Interface in tüm üyeleri Public kabul edilir. Private, Protected, Static gibi tanımlanamazlar.
  • Üyeleri public olarak ta tanımlayamayız, çünkü zaten hepsi public olarak tanımlanmış kabul edilir. Aksi halde hata alırız.
  • Bir arayüzü, başka bir arayüzden türetebiliriz, fakat bir Class tan yada Struct dan türetemeyiz.
  • Interface leri miras alan sınıflar, içerisinde tanımlanan tüm metodları Implemente etmek zorundadır.
  • Şimdi, Samsung adında bir Class ımız olsun ve yukarda tanımlanan Interface lerden IBasliklar arayüzünü miras alsın.


Resim-1

Abstract Classlarda gördüğümüz gibi karşımıza tüm metodları otomatik implement edecek seçenek çıkmaktadır. Fakat burda iki seçeneğimiz var, farklarını hemen açıklayalım.

İlk seçeneğimiz zaten normal olanıdır, yani Interface içerisinde ne kadar metod var ise implement edecektir.

2. Seçeneğimizde, “Explictly” keywordu vardır, Explictly: açıkça, bariz bir şekilde anlamına gelir ve bu şekilde implement edeceğimiz metodların hangi Interface ten türetildiği belirtilmektedir. Bu Explictly nin kullanım amacı da budur, yani karmaşıklığı önler.

Implement işlemini Explictly olarak kullanma durumumuz, birden fazla Interface ten miras aldığımız zamanlar, aynı metod ismi 2 Interface lerde de olabilir. Bu karışıklığı önlemek için metod isimlerinin başına Interface isimleri gelmektedir.

Örneğin yukarda tanımladığımız 2 Interface de “Yazdır()” metodu bulunmaktadır. 1 tane implement edilmiş public Yazdır() metodu varsa sorun olmaz, uygulama hata vermez. Ama ya 2 Yazdır() metodu da farklı işlemler yapıyorsa?

O zaman aşağıdaki gibi tanımlarız.

string IBasliklar.Yazdir()

{

return “IBaslik Yazdır Metodu”;

}

string IUzunluk.Yazdir()

{

return “IUzunluk Yazdır Metodu”;

}

Ve kod tarafında da aşağıdaki gibi çağırırız:

Samsung S3 = new Samsung();

IBasliklar Baslik = (IBasliklar)S3;

IUzunluk Uzunluk = (IUzunluk)S3;

Baslik.Yazdir();

Uzunluk.Yazdir();

Evet, şimdi genel örneğimize geçelim,

Samsung Classını hem IBasliklar, hemde IUzunluk Interface lerinden miras aldırtalım, metodları implement edelim. (“Yazdır()” metodlarımız explictly olarak implemente edilecek)

public class Samsung:IBasliklar,IUzunluk

{

#region IBasliklar Members

public string Isim()

{

return “Model :Galaxy- S3”;

}

public string AnaBaslik()

{

return “Teknoloji”;

}

public string AltBaslik()

{

return “Telefon”;

}

#endregion

#region IUzunluk Members

public string En()

{

return “70,6 mm”;

}

public string Boy()

{

return “136,6 mm”;

}

public string Kalinlik()

{

return “8,6 mm”;

}

public string IBasliklar.Yazdir()

{

return “IBaslik Yazdır Metodu”;

}

public string IUzunluk.Yazdir()

{

return “IUzunluk Yazdır Metodu”;

}

#endregion

}

Implement ettiğimiz metodlar, Interface ismi ile #region – #endregion alanları arasında tanımlanır ki bu metodlarımızın hangi interface altında olduğunu anlamak daha kolay olsun.

Bir Class, birden fazla Interface den kalıtım aldırılacak ise, Interface ler aralarına “,” konulur. (aşağıdaki gibi)

class Samsung:IBasliklar,IUzunluk

Ve Samsung adlı Class ımızı kullanarak verileri getirelim.

static void Main(string[] args)

{

Samsung S3 = new Samsung();

IBasliklar Baslik = (IBasliklar)S3;

IUzunluk Uzunluk = (IUzunluk)S3;

Console.WriteLine(S3.Isim());

Console.WriteLine(“Ana Başlık :” + S3.AnaBaslik());

Console.WriteLine(“Alt Başlık :” + S3.AltBaslik());

Console.WriteLine(Baslik.Yazdir());

Console.WriteLine();

Console.WriteLine(“En :” + S3.En());

Console.WriteLine(“Boy :” + S3.Boy());

Console.WriteLine(“Kalınlık :” + S3.Kalinlik());

Console.WriteLine(Uzunluk.Yazdir());

}

Aldığımız sonuç aşağıdaki gibidir.


Resim-2

Bu makalemde, Interface yapısını, nasıl kullanıldığını ve kullanırken nelere dikkat etmemiz gerektiğini anlatmaya çalıştım.

Yukarda yaptığımız örnekleri içeren uygulamayı buradan indirebilirsiniz.

Bu konuyla ilgili sorularınızı  alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.

Referanslar

www.mshowto.org

Yazı gezinmesi

Mobil sürümden çık