17 Mart 2011 Perşembe

C# Interface Nedir?

.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;

  1. Tüm üyeleri abstract olmak zorundadır. (Üyeleri tanımlarken bizim belirtmemize gerek yoktur. Zaten default olarak abstact’tırlar.)
  2. Uygulandığı sınıf, o interface’in tüm üyelerini ezmek zorundadır. (override anahtar sözcüğünü kullanamayız)
  3. Ü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:

Adsız dedi ki...

Çok açıklayıcı ve net bir yazı olmuş teşekkürler

Adsız dedi ki...

Birçok kitapta tam oturtamadığım konuları burda tam olarak anladım yazılarınızın devamını bekliyoruz..

seocu dedi ki...

Aciklayici bir ders olmus.
Tesekkur ederim.
bunu form1.cs icerisinde nasil kullana bilirim. ?
yani forma cagirma

Adsız dedi ki...

Elinize sağlık.

Ahmet Selim KAHRAMAN dedi ki...

Sayenizde kafamda Interface daha somut bir hal aldı teşekkür ederim

Adsız dedi ki...

çok basit ve açıklayıcı bir ders. teşekkürler

mustafa dedi ki...

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

mustafa dedi ki...

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

Adsız dedi ki...

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..

Adsız dedi ki...

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 ?

Onur Salkaya dedi ki...

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ü.

Unknown dedi ki...

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.

Onur Salkaya dedi ki...

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.

Adsız dedi ki...

Güzel anlatım tşkler...

Adsız dedi ki...

teşekkür ederim

Kidney transplant in Turkey dedi ki...

Gayet açıklayıcı ve anlayabilme açısından basitleştirilmiş örneklerle aktarılmış bir yazı olmuş
Önce tebrik sonra teşekkür ederim

Adsız dedi ki...

harika bir yazı

Serdar dedi ki...

bir türlü anlamadığım şeyi bu kadar güzel anlatımla anladım

Serdar dedi ki...

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();
}

Serdar dedi ki...

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

Hasan Korkmaz dedi ki...

Yanlis anlamadiysam bir sinifi birden fazla kalitima maruz birakiyoruz dogrumu hocam ?

Onur Salkaya dedi ki...

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.

Onur Salkaya dedi ki...

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