.Net’in 5 temel tipinden (class,interface,delegate,struct,enum) biridir. Çoklu kalıtım ihtiyacını gidermek amacı ile kullanılırlar. Interface’leri, yetenek kazandıran şablonlar olarak tanımlayabiliriz. Bir başka deyişle; tüm üyeleri abstract olan sınıflara benzetilebilirler. Bir sınıf birden fazla sınıftan kalıtılamaz, ancak bir sınıfa birden fazla interface’I implement etmek mümkündür. Genelde kullanım amaçları, uygulandığı tiplere bazı kurallar koymak ya da bazı yetenekler kazandırmaktır. Örneklere başlamadan önce abstract kavramını incelemenizde fayda var diye düşünüyorum.
NOT: Interface’ler de, kalıtım yapar gibi ‘ : ’ işareti ile uygulanırlar. ‘ : ‘ işaretinden sonra bir sınıf gelirse, buna “kalıtmak” ya da “extend etmek” deriz. Eğer bir interface gelirse, buna “uygulamak” veya “implement etmek” deriz.
Temel özellikleri;
- Tüm üyeleri abstract olmak zorundadır. (Üyeleri tanımlarken bizim belirtmemize gerek yoktur. Zaten default olarak abstact’tırlar.)
- Uygulandığı sınıf, o interface’in tüm üyelerini ezmek zorundadır. (override anahtar sözcüğünü kullanamayız)
- Üyeleri tanımlarken access modifier (erişim belirleyici) yazamayız. Üyeler default olarak public’tir.
Şİmdi basit bi örnek üzerinde inceleyelim.
Aslan,Kaplan,At ve Inek adında 4 tane sınıf tasarlayalım. İçerisine herhangi bir üye tanımlaması yapmayacağız.
class Aslan
{
}
class Kaplan
{
}
class At
{
}
class Inek
{
}
Şimdi de Etçil ve Otçul adında iki sınıf tasarlayalım. Bu sınıflarımızı abstract olarak tanımlayacağız. Çünkü amaçları, yukarıda yazdığımız sınıflara base class olmaktır.
abstract class Etcil
{
public abstract void BeslenmeSekli_1();
}
abstract class Otcul
{
public abstract void BeslenmeSekli_2();
}
En başta tanımladığımız 4 sınıfı, türlerine göre Etcil ve Otcul sınıflarından kalıtalım;
class Aslan:Etcil
{
public override void BeslenmeSekli_1()
{
Console.WriteLine("Ben etçilim...");
}
}
class Kaplan:Etcil
{
public override void BeslenmeSekli_1()
{
Console.WriteLine("Ben etçilim...");
}
}
class At:Otcul
{
public override void BeslenmeSekli_2()
{
Console.WriteLine("Ben otçulum...");
}
}
class Inek:Otcul
{
public override void BeslenmeSekli_2()
{
Console.WriteLine("Ben otçulum...");
}
}
Simdi de Ayi adında bir sınıf tasarlayalım. Bildiğiniz gibi ayılar hem otçul hem de etçil hayvanlardır. Yani hem etçil hem de otçul sınıfından kalıtım yapmamız gerekecek. Ancak .Net mimarisi çoklu kalıtıma izin vermez. İşte bu noktada interface'ler imdadımıza yetişecektir. Etcil ve Otcul sınıflarını interface olarak tasarlayıp, sınıflarımıza uygulayalım.
public interface IEtcil
{
void BeslenmeSekli_1();
}
public interface IOtcul
{
void BeslenmeSekli_2();
}
.Net’de interface adlandırmaları büyük ‘I’ harfi ile başlar. Bu bir zorunluluk değildir ancak standartlara uymak açısından, bu tip adlandırmalar tercih etmek daha doğru olur.
class Aslan : IEtcil
{
public void BeslenmeSekli_1()
{
Console.WriteLine("Ben etçilim...");
}
}
class Kaplan : IEtcil
{
public void BeslenmeSekli_1()
{
Console.WriteLine("Ben etçilim...");
}
}
class At : IOtcul
{
public void BeslenmeSekli_2()
{
Console.WriteLine("Ben otçulum...");
}
}
class Inek : IOtcul
{
public void BeslenmeSekli_2()
{
Console.WriteLine("Ben otçulum...");
}
}
class Ayi : IOtcul, IEtcil
{
public void BeslenmeSekli_1()
{
Console.WriteLine("Ben etçilim...");
}
public void BeslenmeSekli_2()
{
Console.WriteLine("Ben otçulum...");
}
}
Görüldüğü gibi, interface kullanarak sorunumuzu çözmüş olduk. Bu sayede Ayi sınıfımıza hem etçil hem de otçul olma özelliğini kazandırmış olduk.
23 yorum:
Çok açıklayıcı ve net bir yazı olmuş teşekkürler
Birçok kitapta tam oturtamadığım konuları burda tam olarak anladım yazılarınızın devamını bekliyoruz..
Aciklayici bir ders olmus.
Tesekkur ederim.
bunu form1.cs icerisinde nasil kullana bilirim. ?
yani forma cagirma
Elinize sağlık.
Sayenizde kafamda Interface daha somut bir hal aldı teşekkür ederim
çok basit ve açıklayıcı bir ders. teşekkürler
Eline sağlık Onur hoca.Ben yeni ve Acemi C# cıyım. Sizin makalelerinizden Mükemmel faydalanıyorum.Keşke bir kitap veya Video dersleriniz olsa . Bilgilendirme ve Eğitimimize faydalı olan bu makalelerinizin devamını Bekliyorum
Eline sağlık Onur hoca.Ben yeni ve Acemi C# cıyım. Sizin makalelerinizden Mükemmel faydalanıyorum.Keşke bir kitap veya Video dersleriniz olsa . Bilgilendirme ve Eğitimimize faydalı olan bu makalelerinizin devamını Bekliyorum
ya yemin ediyorum harika anlatıyosunuz, bu işi çok iyi bildiğinizden çok basit ama çok açıklayıcı örneklerle zihine kazıyosunuz başarılarınızn devamını dilerim, piyasada sizin gibi anlatan örnek veren gerçekten yok , bir kitap çıkartarak devrim yapacağınza inaniyorum..
Uygulandığı sınıf, o interface’in tüm üyelerini ezmek zorundadır. (override anahtar sözcüğünü kullanamayız) demişşiniz , ama örneklerde override olarak kullanmışşınız , heralde (override anahtar sözcüğünü kullanmalıyız) olucak ben mi yanlış anladım acaba ?
Merhaba,
Bahsettiğiniz kısımda Etcil ve Otcul adında iki "abstract" sınıftan gelen üyeleri ezdiğimiz zaman override anahtar sözcüğünü kullandık. Yani yazının ilk bölümünde.
İkinci bölümde IEtcil ve IOtcul interface'den gelen üyelerde override anahtar sözcüğünü kullanmadık. Zaten default olarak ezilmek zorundalar çünkü.
Makale icin tesekkur ederim ben de.
Interface sadece bu mudur ?
Yani bu kadar basit bir sey midir ?
Yoksa daha baska amaclar icin kullanim sekilleri var midir ?
Bir de abstract siniflarla interface arasindaki en onemli fark --> "Bir sinifa birden fazla class extend edemiyoruz.O yuzden de interface kullaniyoruz." Bu mudur ?
Umarim cevaplarsiniz :)
iyi gunler.
Merhaba,
Kavram olarak baktığımızda bundan fazlası değildir. Ancak teknik açıdan ve kullanım alanı olarak baktığımızda birçok yerde karşımıza çıkacaktır. Tüm design pattern'lerde, wcf servislerde, nesne yönelimli mimarilerde fazlası ile kullanılırlar. Zaten .Net framework içerisinde ufak bir gezinti yaptığınızda da sıkça kullanıldıklarını göreceksiniz.
Abstract sınıfla aralarındaki en önemli fark, birden fazla Interface'in bir sınıfa implement edilmesidir. Dolayısı ile c#'da izin verilmeyen çoklu kalıtıma bir çözüm sunmaktadır.
Güzel anlatım tşkler...
teşekkür ederim
Gayet açıklayıcı ve anlayabilme açısından basitleştirilmiş örneklerle aktarılmış bir yazı olmuş
Önce tebrik sonra teşekkür ederim
harika bir yazı
bir türlü anlamadığım şeyi bu kadar güzel anlatımla anladım
Tüm üyeleri abstract olmak zorundadır. (Üyeleri tanımlarken bizim belirtmemize gerek yoktur. Zaten default olarak abstact’tırlar.)
benmi yanlış anladım yoksa interface tanımlamasını kastetmedinizmi ? çünkü interface abstract olamıycağı için üyeside abstract olamıyor.Nasıl default olarak abstract lar ?
public interface IEtcil
{
void BeslenmeSekli_1();
}
birde etcil için ayrı otcul için ayrı interface ler yapmışsınız oldu ya iki gün sonra atıyorum suda yaşayanlar içinde bir interface tanımlanacaktı bunun yerine
public interface IHayvanlar
{
void BeslenmeSekli();
}
olsa tüm sınıflar bundan kalıtılsa
Yanlis anlamadiysam bir sinifi birden fazla kalitima maruz birakiyoruz dogrumu hocam ?
Hasan bey,
Soylediğiniz şey pratikte doğru ama teknik olarak doğru değildir.
Kalıtım, sınıflar yardımı ile uygulanır aslında. Interface'ler için "implement etmek" ya da en yakın yerli tabir ile "şablonu uygulamak" tabiri kullanılır.
C#'da bir sınıfı birden fazla sınıftan kalıtamazsınız, yani çoklu kalıtıma izin yoktur. Ancak bir sınıfa , birden fazla interface şablonu uygulanabilir (implement edilebilir). Dolayısıyla interface'ler çoklu kalıtım problemine bir çozum sunarlar.
Serdar bey,
Oluşan assembly'nin CIL kodlarına bakarsanız 'BeslenmeSekli_1' metodunun biz yazmamamıza rağmen abstract olarak tanımlandığını gorebilirsiniz. Interface'in tum uyeleri default olarak abstract olacağından dolayı, bizim ekstradan yazmamıza gerek olmadığını ifade ettim.
İkinci sorunuz tercih meselesidir. Kendinize gore doğru olduğunu duşunduğunuz herhangi bir yontemi kullanabilirsiniz.
Yorum Gönder