Arayüz (interface), OOP'nin en önemli yapılarındandır ve temelde sınıflara sunabileceğiniz, sınıfın hangi isimde ve hangi tipte parametreleri alan bir metoda sahip olacağını söylemenizi sağlayan yapıdır.
Bir sınıfa istediğiniz kadar arayüz uygulayabilir / giydirebilirsiniz (implement). Arayüz içine yazılan metotların işlemleri kesinlikle yazılmaz. Arayüzler hangi işin yapılması gerektiğini belirtir ama nasıl yapılacağına karışmaz. Bu metotların işlemleri, arayüzün uygulandığı sınıfta yazılır. Arayüzün access modifier'ı olsa da, içine yazılanların olmaz.
Arayüzler esas gücünü ve önemini çokbiçimlilikten (polymorphism) alır, çünkü çokbiçimlilik normal bir sınıfla yapılabildiği gibi, aynı arayüz giydirilmiş nesneler arasında da kullanılabilir. Arayüzler .NET Framework içinde de sıklıkla kullanılır.
Arayüzler sınıflara kural getirmek için kullanıldığı gibi, ortak kullanım alanları da oluştururlar. Örneğin; kayıt özelliği kazandırmak istediğimiz birtakım sınıfımız elimizde olsun (örn: Öğrenci, Öğretmen ve Ders). Bu sınıfların kayıt işlemleri için kullanacağı belli başlı metotlar olacaktır. (Örn: Kaydet, Sil, Düzenle ve VeriGetir gibi.) Bu kalıbı bir interface içerisine yerleştirdiğimizde ve kullanacak sınıflara giydirdiğimizde aslında bu sınıflar için kural koymuş oluruz.
Örnek olarak, foreach'in çalışabilmesi için nesne IEnumerable, listbox'ta bir nesneyi gösterebilmek için IList arayüzünü uygulamış nesneleri kullanır ve IList birçok dizi tabanlı yapının temelinde bulunur (listboxt.items, arraylist vb.).
Örnek:
interface KayitIslemleri
{
void Kaydet();
void Guncelle();
void Sil();
}
class Ogrenci:KayitIslemleri
{
public void Kaydet()
{
throw new NotImplementedException();
}
public void Guncelle()
{
throw new NotImplementedException();
}
public void Sil()
{
throw new NotImplementedException();
}
}
class Ogretmen : KayitIslemleri
{
public void Kaydet()
{
throw new NotImplementedException();
}
public void Guncelle()
{
throw new NotImplementedException();
}
public void Sil()
{
throw new NotImplementedException();
}
}
Gördüğünüz gibi, üstteki örnekte Ogrenci ve Ogretmen sınıfı, Kayitislemleri arayüzünü uygular. Bu arayüzün uygulandığı sınıf, kaydet, güncelle, sil metoduna sahip olmak zorundadır. Arayüzler sayesinde yukarıda oluşturduğumuz yapıda ortak noktalar belirledik. Örneğini aldığımız sınıfın türünü bilmeden (Öğrenci veya Öğretmen) içerisinde Kaydet, Guncelle ve Sil metotlarının olduğunu bilmekteyiz. Bu sayede toplu işlemler yapmak istediğimiz zaman arayüzün bize getirdiği bu avantajdan faydalanabiliriz. Aşağıdaki örnekte toplu şekilde silme işlemi gerçekleştirilmektedir.
//örneği alınacak öğretmen ve öğrenci sınıfları bu dizinin içinde toplanacaktır.
KayitIslemleri[] ogrencilerveogretmenler = new KayitIslemleri[2];
Ogrenci ogrenci = new Ogrenci();
//bir üst satırda örneği alınmış Ogrenci sınıfı dizinin ilk sırasına yerleştiriliyor.
ogrencilerveogretmenler[0] = ogrenci;
Ogretmen ogretmen = new Ogretmen();
//bir üst satırda örneği alınmış Ogretmen sınıfı dizinin ikinci sırasına yerleştiriliyor.
ogrencilerveogretmenler[1] = ogretmen;
//dizi içerisinde gezilerek ilgili sıradaki nesnenin ne olduğu bilinmeden silme işlemi gerçekleştiriliyor.
for (int i = 0; i < ogrencilerveogretmenler.Length; i++)
{
ogrencilerveogretmenler[i].Sil();
}
Arayüzler yazılım prensiplerinde de sıkça bahsedilen bir konudur. Dependency Inversion yazılım prensibini bu konuda araştırabilirsiniz.