Arkadaşlar merhaba, bu makalede sizlere interface kavramının ne olduğundan, ne işe yaradığından, nerelerde kullanabileceğimizden ve abstract sınıflardan farklarının ne olduğundan bahsedeceğim.
Öncelikle şunu söyleyeyim Interface kavramı .NET’e veya Java’ya özgü bir şey değil, pek çok programlama dilinde uygulanabilirliği olan bir yapıdır.Şöyle bir cümle kuralım bakalım; C#’da struct, class ve interface vardır. Birde delegate vardır ama o özünde bir sınıftır.
Interface bir duruma ilişkin veya bir işleme ilişkin kuralları belirler. Demek istediğim şeyi örnek üzerinden açıklayalım. Koleksiyonları biliyosunuzdur. Koleksiyonlar, içerisine değişik türlerde pek çok eleman alabilen yapılardır. Örneğin List sınıfını düşünelim. List sınıfı içerisine herhangi bir nesneyi ekleyebilir ileride kaldırabilirsiniz. Elinizde 100 adet eleman içeren bir List nesnesi olduğunu düşünün ve siz bu listedeki her bir elemana ulaşıp, her bir elemanla ilgili bir işlem yapmak istiyorsunuz yani bu koleksiyon içinde gezinti yapmak istiyorsunuz. Düşüncemiz şu, index değeri 0’dan başlayalım ve bitene kadar gidelim.Önce 0 indexli sonra 1 indexli ardından 2 indexli vs. en sonda 99 indexli elemanı gezelim ve işlemimizi yapalım. Velhasıl kelam listenin başından başlayalım sonuna kadar gidelim.
Şimdi de bu olayı geniş açılardan düşünelim. Elimizde bir LinkedList var, Hashtable var, Stack var, Queue var, Graph var. Yani değişik biçimlerde tonla koleksiyon var biz her birinde bir gezinti işlemi yapmak istiyoruz. Örneğin LinkedList’deki gezimiz şöyle olacaktır. Önce bir eleman al ardından bu elemanın gösterdiği elemanı – ki belki 53. elemanı gösteriyor olabilir- al ve böylece devam et. Stack yapısında ise önce en son listeye ekleneni al sonra en sondan bir önce ekleneni al. Queue yapısında ise önce ilk ekleneni sonra ikinci ekleneni al ve böyle devam et.
Kısacası arkadaşlar şunu demek istiyorum, pek çok koleksiyon türü(yani birden fazla elemanı tutabileceğimiz yapılar) mevcut ve her birinde elemanlar üzerinde gezinti yapma işlemi farklı farklı yani bir standardı yok. Öyle bir yapı kuralım ki her türlü koleksiyon üzerinde gezinti yapma işlemi bir standarda bağlansın.
Biz biliyoruz ki bir koleksiyon üzerinde şu işlemler standarttır;
- İlk elemana git
- Son elemana git
- Bir sonrakine git
- n sonrakine git
- Şuan ki nesne hangisi?
Bu işlemler her bir koleksiyon da olacak, orası tamam. Birde her bir kolleksiyon yukarıda saydığımız işlemleri yapacak, yapabilecek(Can Do).
İşte bu kadar gevezelik yaptıktan sonra diyoruz ki, Interface’leri burada kullanabiliriz. Interface bir sınıfın neler yapabileceğini, neler yapması gerektiğini özetler. Evet işte bu(!). Bu sözü sevdim. Interface bir sınıfın neler yapması gerektiğini özetler.
Şimdi biz bu işlemleri yapacak bir interface tanımlayalım;
|
public interface IVisitor {
void First();
void Last();
bool MoveNext();
object Current { get; }
void Next(int count);
}
|
Interface tanımlamak için yukarıdaki modeli kullanıyoruz. interfaceanahtar kelimesi olacak ve isminin ilk harfi ‘I’ ile başlayacak. Bu her ne kadar zorunluluk olmasa da, kabul görmüş bir kullanım şeklidir. Ardından metodları ve property’leri tanımlıyoruz ama dikkat edin erişim belirteci(public,private,protected) gibi şeyler yazmak yok, çünkü hepsi public’tir. Süslü parantez falan filan yok doğrudan noktalı virgülü yaz. Current dediğimiz şey bir property’dir dikkat edin içinde sadece get metodu var.
İşte interface’in tanımlaması bu kadar. Bunu kaydettik. Şimdi şunu söyleyelim;
Bir sınıfın bu interface’i implement etmesi demek içindeki her bir metodu, property’i kodlaması demektir. Yani bir sınıf IVisitorinterface’ini implement ediyorsa, bu sınıf First, Last, MoveNext, Current, Next birimlerinin içlerini doldurmak zorundadır.
Örneğin Graph sınıfı için bir GraphVisitor sınıfı yapacak isek bu sınıf şöyle olmalıdır;
|
public class GraphVisitor : IVisitor {
public void First() {
// İlk elemana giden kod buraya yazılır.
}
public void Last() {
// Son elemana giden kod buraya yazılır.
}
public bool MoveNext() {
// Bir sonraki eleman varmı yok mu? elde edilen kod buraya yazılır.
}
public object Current {
get {
// o anki elemanı elde eden kod buraya yazılır.
}
}
public void Next(int count) {
// Bir sonraki elemana giden kod buraya yazılır.
}
}
|
Dikkat ederseniz bu sınıfta, IVisitorinterface’indeki her şey mevcuttur. Zaten olmak da zorundadır. Olmaz ise derleme zamanı hatası alırız.
Birde özetleyelim bakalım;
- Interface interfacekeyword’ü kullanılarak oluşturulur.
- İçinde tanımlanan birimler public, protected veya private gibi değerler olamaz. Kendiliğinden public’tir.
- Interface bir sınıfın neler yapabileceğini(Can Do) ve neler yapmak zorunda olduğunu anlatır.
- Bir sınıf birden fazla Interface’i implement edebilir.
- Bir interface’i implement eden sınıf, o interface içindeki her şeyi implement etmek zorundadır.
- Interface ile sınıf arasında is-a(inheritence) ilişkisi yoktur.
- Birden fazla yazılım elemanı çalışan bir projede grup içerisindeki kişilerin yazdıkları kodların bir standarda oturmasını istiyor iseniz, Interface tanımlayın ve yazılım elemanları bu interface’i implement etsin. Böylelikle sınıflarda hangi isimde metodlar, property’ler var rahatlıkla bilinebilir.
Peki hocam heryerde karşılaşıyorum bide sana sorayım bakalım, bir sınıf yapsam türü de abstract olsa, içindeki her şeyde abstract olsa. Biz biliyoruz ki abstract sınıf ve metodların içine kod falan yazılmaz yani aynı interface gibidir. Aradaki fark nedir derseniz;
Listeleyelim derim;
- Class-Interface arasında yapılabilirlik (Can Do-Must Do) ilişkisi vardır, Class Class arasında inheritence(is-a) ilişkisi vardır.
- Bir class birden fazla class’tan inherit edemez ama birden fazla interface’i implement edebilir(ki bu çok önemli bir farktır.)
- Interface’de bir şeylerin public, private falan olmasını sağlayamazsınız ama class’ta böyle bir şey yapılabilir.
- Abstract sınıf içinde abstract metod tanımlayabileceğiniz gibi abstract olmayan (örneğin virtual) bir metod tanımlayabilirsiniz.
- Her ikisinde de new ile bir nesne oluşturamazsınız.
- Şöyle bir istek var; “Bir işlem var ve alt sınıflar bu işlemi kendilerine göre özelleştirebilirler. Özelleştirmezler ise default olarak bir kod işletilsin”.
Interface’de default olarak herhangi bir kod yazılamazken, abstract sınıf içerisinde yazılabilir.
- Yeni bir interface sıcak geldi, fırından çıktı,hemen sınıfa : InterfaceAdi yap, metodlarını implement et kullan. Ama fırından sıcak yeni bir abstract sınıf çıktı. Hemen bir sınıfta bunu kullanamazsın çünkü o sınıf başka bir sınıftan inherit ediliyor olabilir.
- Interface daha yavaşmış ama test etmedim J
- Interface’e yeni bir metod ekledin. Bu interface’i implement eden sınıflar çalışmaz çünkü eklediğin metodu ilgili sınıfta implement etmen(kodunu yazman) gerekiyor ama asbtract sınıfta metodu abstract yapmaz isen böyle bir derdin yok.
Unutuyordum Az Kalsın: Bir sınıfı bir interface’den implement ettiniz.

Yazdığınız interface’in sol alt köşesinde bir çizgi var ona tıklayınca bütün birimler otomatik implement ediliyor. Yada Shift+ALT+F10+ENTER yapın.
Makalemizin sonuna geldik arkadaşlar. Bir sonraki makalemde görüşmek dileğiyle hoşçakalın.