none
C# Interface Yapısını Anlayamadım RRS feed

  • Soru

  • Arkadaşlar Egitim Videosunda Aşagıdaki Gibi İnterface IEnumerable IEnumerator Gibi Yapıları Anlatan Aşagıdaki Video Kodlar Örneklendirmş Lakin Ben Hiç Bişe Anlamadım Bu Yapıyı Nerede Kullanılırız Ne İşimize Yarar Mantıgı Nedir Yardımcı Olabilirmsiniz...

    program cs Classımız

     static void Main(string[] args)
            {
                DersList derslerim = new DersList();
                derslerim.Ekle(new Ders { DersAdı = "Matematik" });
                derslerim.Ekle(new Ders { DersAdı = "Fizik"});
                derslerim.Ekle(new Ders { DersAdı = "Kimya" });

                foreach (var i in derslerim)
                {
                    Console.WriteLine(i);
                }
                Console.Read();
            }
        }
    }

    Ders Classımız

    public class Ders
        {
            public string DersAdı { get; set; }

            public override string ToString()
            {
                return this.DersAdı;
            }

        }
    }

    --------------------------------------------------

    DersList Classımız

                    

      public class DersList : IEnumerable
        {
            List<Ders> dersler;

            public DersList()
            {
                dersler = new List<Ders>();
            }

            public void Ekle(Ders eklenecekDers)
            {
                dersler.Add(eklenecekDers);
            }

            public IEnumerator GetEnumerator()
            {
                return new DersEnumerable(dersler);
            }
        }
        public class DersEnumerable : IEnumerator
        {
            List<Ders> dersler;
            int index = -1;
            public DersEnumerable()
            {

            }

            public DersEnumerable(List<Ders> dersList)
            {
                dersler = dersList; 
            }

            public object Current
            {
               get{ return dersler[index]; }
            }

            public bool MoveNext()
            {
                index++;
                return (index < dersler.Count);
            }

            public void Reset()
            {
                index = -1;
            }
        }
    }

    24 Haziran 2016 Cuma 20:21

Yanıtlar

  • Her kelimenin harfini bilerek mi büyük yazıyorsun yoksa forumun bir bugı mı? Bir kaç kişi daha yapıyor bunu. Soruyu okuma hızım ciddi şekilde düşüyor böyle olunca.

    Uzun uzun bir soru altına makale yazamamı bekleme o kadar vaktin maalesef yok. Biraz özet geçeyim.

    Öncelikle Arayüz (Interface) ne demek ne işe yarar onu anlamalısın.

    Evinde duvardaki prizi düşün. O tipik bir arayüz örneğidir. Her cihaz üreticisi kendi kafasına göre fiş yaptığını hayal etsene ? Bunun yerine ITurkeyPlug arayüzünü kullanırlar.

    Kodlamaya geri dönelim. Senin bir sınıfında bir method parametre olarak başka bir sınıf alacak. Ve örneğin bu sınıftaki Hesapla() isimli methodu çağrıcak. Ve bu method a parametre olarak verilecek sınıfın sadece Hesapla() methodu olması senin için yeterli. Sınıfın kendisinin hiç bir önemi yok. Aynı prize takacağın cihazın ne olduğunun öneminin olmaması gibi.

    Bu yüzden 

    interface IHesaplanabilir {
    void Hesapla();
    }


    gibi bir arayüz tanımlarsın.  Kendi class ında daki methodun da artık şöyle olur :

    void Method(IHesaplanabilir nesne){

    nesne.Hesapla();

    }

    Böylece bu arayüzü uygulamış hangi sınıf olursa olsun kullanabilirsin.

    .net de kendi bult-in (önceden hazırlanmış) arayüzleri ile gelir. Bu arayüzler de c# gibi programlama dillerinde sana ek özellikler kazandırır. Örneğin foreach döngüsü kurabilmen için ilgili Sınıfın IEnumerable ve IEnumerator arayüzünü uygulaması gerekir. Çünkü foreach döngüsü arkaplanda bu arayüzün methodlarını çağırır. 

    25 Haziran 2016 Cumartesi 13:47
  • Interface'in iki kullanım alanı var 

    1. Class'ın içinde ne olması gerektiğini interface ile tarif edersin.

    Örneğin web uygulamasında , forum var, makale var, yorumlar var, haberler var diyelim. Ve sen site içi arama yapıldığında bunların hepsinde arama yapmak istiyorsun diyelim. Bunların hepsinde ortak olması gerekenleri interface de belirtirsin;

    public interface IAranabilir
    {
    int Id { get; set; } string Başlık { get; set; } string Metin { get; set; } }

    IAranabilir ile implemente ettiğin bütün classlarda bu iki özellik olmak zorunda olur, yoksa derleme hatası alırsın.

    public class Makale : IAranabilir
    {
       public int Id { get; set; } //bu
    public string Başlık { get; set; } //bu public string Metin { get; set; } //ve bu interfaceden dolayı kesin olmak zorunda public DateTime { get; set; } public int KullanıcıId { get; set; };
    }


    Şimdi arama algoritmanı yazıp, bulunan sonuçları;

    var sonuçlar = new List<IAranabilir>();

    isimli listenin içine doldurabilir sayfanda listeleyebilirsin. Çünkü tüm IAranabilir ler içinde Id, Başlık ve Metin kesin var. 

    Not bu yukarıdaki işlem abstract class ile de yapılabilir. Okuduğun makalelerde interface in gereksiz olduğunu okumuş olabilirsin, buna kulak asma çünkü;

    2. Managed Assembly niz içindeki classlara unmanaged assemblylerin erişebilmesi için interface kullanırız. c++ gibi unmanaged bir dille yazılmış bbir uygulama sizin classlarınızı kullanacaksa, o na classlarınızı interface ile tanıtırsınız, yoksa classlarınızı göremeyecektir.


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com


    26 Haziran 2016 Pazar 09:42
    Moderatör

Tüm Yanıtlar

  • Arabanın nasıl çalıştığını bilmek gibi düşünebilirsin. Bilmeden de gayet sürebilirsin. Bilirsen daha ekonomik, daha performanslı, daha az arıza çıkartacak şekilde sürebilirsin.

    .net içerisindeki tüm koleksiyon tipleri bu örnek verdiğin arayüzleri uygular. Durum böyle olunca, linq olsun farklı sorgulama yöntemleri olsun bunları anlaman daha kolay olacaktır. 

    24 Haziran 2016 Cuma 20:36
  • Biraz Daha Detaya Girebilirmisin Egitim Videosu Detaya Girmemiş Yüzeysel Anlatmış Ama Mantıgın Oturmaıs Lazım Nerelerde Kullanabiliriz Bu Yapıyı Console Çıktısında Matematik Fizik Kimya Yazıyor Bunu Generic veya Non Generic Kolleksiyonlarlada Yapabilriz Nerelerde Ne İçin Kullanıalcagına Dair Örnek Hazırlanmamış
    24 Haziran 2016 Cuma 21:10
  • Her kelimenin harfini bilerek mi büyük yazıyorsun yoksa forumun bir bugı mı? Bir kaç kişi daha yapıyor bunu. Soruyu okuma hızım ciddi şekilde düşüyor böyle olunca.

    Uzun uzun bir soru altına makale yazamamı bekleme o kadar vaktin maalesef yok. Biraz özet geçeyim.

    Öncelikle Arayüz (Interface) ne demek ne işe yarar onu anlamalısın.

    Evinde duvardaki prizi düşün. O tipik bir arayüz örneğidir. Her cihaz üreticisi kendi kafasına göre fiş yaptığını hayal etsene ? Bunun yerine ITurkeyPlug arayüzünü kullanırlar.

    Kodlamaya geri dönelim. Senin bir sınıfında bir method parametre olarak başka bir sınıf alacak. Ve örneğin bu sınıftaki Hesapla() isimli methodu çağrıcak. Ve bu method a parametre olarak verilecek sınıfın sadece Hesapla() methodu olması senin için yeterli. Sınıfın kendisinin hiç bir önemi yok. Aynı prize takacağın cihazın ne olduğunun öneminin olmaması gibi.

    Bu yüzden 

    interface IHesaplanabilir {
    void Hesapla();
    }


    gibi bir arayüz tanımlarsın.  Kendi class ında daki methodun da artık şöyle olur :

    void Method(IHesaplanabilir nesne){

    nesne.Hesapla();

    }

    Böylece bu arayüzü uygulamış hangi sınıf olursa olsun kullanabilirsin.

    .net de kendi bult-in (önceden hazırlanmış) arayüzleri ile gelir. Bu arayüzler de c# gibi programlama dillerinde sana ek özellikler kazandırır. Örneğin foreach döngüsü kurabilmen için ilgili Sınıfın IEnumerable ve IEnumerator arayüzünü uygulaması gerekir. Çünkü foreach döngüsü arkaplanda bu arayüzün methodlarını çağırır. 

    25 Haziran 2016 Cumartesi 13:47
  • Cihan bey yazıyı her harfin büyük yazma yazımı düzenli durması için alışkanlık ama interface yine anlamış degil özellikle verdigim koddan sonra kafam iyice karıştı interface gerke varmı yukarıdaki kod maşallah ekrana matematik türkçe fizik yazmak için epey çalışmış hani mantıklı bir proje olsa hak verecegim yani bir karışık olmuş anlaşılır kaynak veya bir makale varmı 
    25 Haziran 2016 Cumartesi 19:24
  • Küçük sallama projeler için evet gerek yok, ama proje büyüdükçe ihtiyaca dönüşüyor. Dediğim gibi makale özeniyle yazmadım cevabı, tekrar tekrar okuyabilirsin. Özellikle anlamadığın kısım varsa sorabilirsin. Adam orada sadece IEnumerable arayüzünü örnekliyor, eğer bir gerçek dünya örneği hazırlasaydı o sınıf hem çok uzun olurdu hem de anlamadığın çok fazla şey olurdu. Yine de böyle örnekler incelemek istersen .net içerisindeki tüm koleksiyon sınıfları IEnumerable arayüzünü uygular. Sen de .net'in kaynak kodlarına bakıp inceleyebilirsin. List<T>, SortedList<T>, ArrayList... gibi sınıflara bakabilirsin. Herhangi bir C# kitabında interface kısmına bakabilirsin.

    Ama sana verebileceğin en büyük tavsiye OOP nedir öğrenmen. OOP'u herkes basitçe class yazmak ya da bir class ın diğerinden türetmek gibi çok sığ şekilde algılıyor. Ama aslında bundan çok daha fazlası. OOP 'u algılayıp SOLID, DRY gibi prensipleri öğrenmen gerekir. Tüm bunları algıladığında zaten elin interface yazmaya kendi kendine gidecektir. 


    26 Haziran 2016 Pazar 09:18
  • Interface'in iki kullanım alanı var 

    1. Class'ın içinde ne olması gerektiğini interface ile tarif edersin.

    Örneğin web uygulamasında , forum var, makale var, yorumlar var, haberler var diyelim. Ve sen site içi arama yapıldığında bunların hepsinde arama yapmak istiyorsun diyelim. Bunların hepsinde ortak olması gerekenleri interface de belirtirsin;

    public interface IAranabilir
    {
    int Id { get; set; } string Başlık { get; set; } string Metin { get; set; } }

    IAranabilir ile implemente ettiğin bütün classlarda bu iki özellik olmak zorunda olur, yoksa derleme hatası alırsın.

    public class Makale : IAranabilir
    {
       public int Id { get; set; } //bu
    public string Başlık { get; set; } //bu public string Metin { get; set; } //ve bu interfaceden dolayı kesin olmak zorunda public DateTime { get; set; } public int KullanıcıId { get; set; };
    }


    Şimdi arama algoritmanı yazıp, bulunan sonuçları;

    var sonuçlar = new List<IAranabilir>();

    isimli listenin içine doldurabilir sayfanda listeleyebilirsin. Çünkü tüm IAranabilir ler içinde Id, Başlık ve Metin kesin var. 

    Not bu yukarıdaki işlem abstract class ile de yapılabilir. Okuduğun makalelerde interface in gereksiz olduğunu okumuş olabilirsin, buna kulak asma çünkü;

    2. Managed Assembly niz içindeki classlara unmanaged assemblylerin erişebilmesi için interface kullanırız. c++ gibi unmanaged bir dille yazılmış bbir uygulama sizin classlarınızı kullanacaksa, o na classlarınızı interface ile tanıtırsınız, yoksa classlarınızı göremeyecektir.


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com


    26 Haziran 2016 Pazar 09:42
    Moderatör
  • interface'i anlatan anlaşılır bir link

    • Düzenleyen b.u 27 Haziran 2016 Pazartesi 07:21
    27 Haziran 2016 Pazartesi 07:20
  • Bu Neden Bu Kadar Karışık Geliyor Bana Üzerinde Baya Durmam Lazım
    27 Haziran 2016 Pazartesi 18:41
  • tELEVİZYONUN aRKASINDA aNTEN gİRİŞİ yOKSA bİ şEY sEYREDEMEZSİN. iNTERFACE dE bÖYLE bİŞEY iŞTE.

    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    27 Haziran 2016 Pazartesi 21:49
    Moderatör
  • yA Da eN baSidİnDen USb girİşi öRneK verİleBiliR.

    28 Haziran 2016 Salı 05:56
  • Peki şu aşagıdaki yapıda neden ihtiyaç duymuş interface çokmu ileri düzey de benmi çözemiyorum olacak ama biraz geç olacak sanırım :D

      static void Main(string[] args)
            {

                List<Takım> takımlar = TakımDoldur();

                var sonuc = takımlar.Distinct(new TakımComparer());

                foreach (var t in sonuc)
                {
                    Console.WriteLine(t);
                }

                Console.Read();
            }

            static List<Takım> TakımDoldur()
            {
                List<Takım> takımlar = new List<Takım>()
                {
                 new Takım {Ad="Chelsea",Ulke="İngiltere" },
                 new Takım {Ad="Bayern Munich",Ulke="Almanya"},
                 new Takım {Ad="Juventus",Ulke="İtalya" },
                 new Takım {Ad="ManChester United",Ulke="İngiltere" },
                 new Takım {Ad="Napoli",Ulke="İtalya" },
                 new Takım {Ad="Celtic",Ulke="İskoçya" }
                };
                return takımlar;
            }

        }

        class Takım
        {
            public string Ad { get; set; }

            public string Ulke { get; set; }

            public override string ToString()
            {
                return Ad;
            }
        }

        class TakımComparer : IEqualityComparer<Takım>
        {
            public bool Equals(Takım x, Takım y)
            {
                if (x.Ulke.Equals(y.Ulke))
                    return true;
                else
                    return false;
            }

            public int GetHashCode(Takım obj)
            {
                return obj.Ad.GetHashCode();
            }
        }
    }

    29 Haziran 2016 Çarşamba 20:37
  • Öncelikle bu örnekte mantık hatası var; Distinct methodu etkisiz olur. Çünkü GetHashCode methodu Ad alanına göre int döndürür, Ama Equals Ülkeye göre yapılmış. return obj.Ulke.GetHashCode(); olsa çalışırdı. Ama anlamsız olurdu, çünkü her ülkeden bir takım gösterir. Bilmem belki bir kullanım alanı olabilir... neyse.

    Ben buna benzer nispeten daha mantıklı  bir örnek yazayım;

    void Main()
    {
    	var kutular = new [] {
    		new Kutu() { En = 120, Boy = 80, Yükseklik = 90, Renk = "Sarı"},
    		new Kutu() { En = 100, Boy = 80, Yükseklik = 90, Renk = "Kırmızı"},
    		new Kutu() { En = 120, Boy = 40, Yükseklik = 90, Renk = "Mavi"},
    		new Kutu() { En = 120, Boy = 80, Yükseklik = 90, Renk = "Yeşil"},
    		new Kutu() { En = 100, Boy = 80, Yükseklik = 90, Renk = "Kırmızı"},
    		new Kutu() { En = 120, Boy = 80, Yükseklik = 50, Renk = "Mavi"},
    		new Kutu() { En = 140, Boy = 80, Yükseklik = 40, Renk = "Mavi"},
    		new Kutu() { En = 140, Boy = 80, Yükseklik = 80, Renk = "Kırmızı"},
    		new Kutu() { En = 120, Boy = 80, Yükseklik = 50, Renk = "Yeşil"}
    	};
    
    	kutular.Distinct(new KutuKarşılaştırıcı()).Dump();
    }
    
    class Kutu
    {
        public int En { get; set; }
    	public int Boy { get; set; }
    	public int Yükseklik { get; set; }
    	public string Renk { get; set; }
    }
    
    class KutuKarşılaştırıcı : IEqualityComparer<kutu>
    {
    	public bool Equals(Kutu x, Kutu y)
    	{
    		return (x.En == y.En & x.Boy == y.Boy & x.Yükseklik == y.Yükseklik);
    	}
    	
    	public int GetHashCode(Kutu Obj)
    	{
    	   return (Obj.En ^ Obj.Boy ^ Obj.Yükseklik).GetHashCode();
    	}
    }

    Şimdi amacım listede birbirine eşit olan kutulardan sadece bir adet olacak şekilde yeni bir liste üretmek. Ama Bir kutunun bir birine eşit olduğuna nasıl karar vereceğiz? "Hem eni, hem boyu hem de yüksekliği aynıysa kutular eşittir" önermesini uygulamamız lazım.

    Distinct methodunu tasarlayanlar IComparer den implemente edilmiş bir class parametreli overloadını yapmışlar ki "neye göre farklı" olduğunu belirtebilelim. Parametre IComparer olduğundan içinde Equals ve GetHashCode isimli iki method olduğu kesin. Çünkü interfacede bu yazıyor; "IComparerler içinde bool döndüren iki parametreli bir Equals ve int döndüren bir parametreli GetHashCode olmalıdır" diyor.

    Yani IComparer (IEqualtyComparer de IComparer den implemente bu kafanı karıştırmasın) den implement ettiğin bir class yapıyorsan içine Equals ve GetHasCode methodlarını koymak zorundasın.

    Böylece Distinct methoduna verilen parametrenin içinde GetHashCode ve Equals olmasını mecbur koşmuşlar ki iki obje arasındaki farkı anlayabilsinler.


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com








    29 Haziran 2016 Çarşamba 22:20
    Moderatör
  • Linq içinde birden fazla olan item leri listeleyen bir method yok mesela, biz yazacak olsaydık;

    static class BenimLinq
    {
       public static IEnumerable<T> BirdenFazla<T>(this IEnumerable<T> Liste, IEqualityComparer<T> Karşılaştırıcı)
       {
              var tempList = new List<int>();
              foreach(T item in Liste)
    	  {
    	        if(Liste.Count(p => Karşılaştırıcı.Equals(item, p))>0 && !tempList.Contains(Karşılaştırıcı.GetHashCode(item)))
    		{
    			tempList.Add(Karşılaştırıcı.GetHashCode(item));
    	  		yield return item;
    		}
    	  }
       }
    }

    Belki daha güzeli yazılır, ama bu saatte kafa bu kadar bastı :)

    BirdenFazla methoduna hazırla bitane IEqualityComparer, sana comparerde belirttiğin önermeye göre birden fazla olanların listesini versin.


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com


    29 Haziran 2016 Çarşamba 22:52
    Moderatör
  • Önay Bey IEnumerable  ve IEqualityComparer Arka Planda ne iş yapıyorlarda bunlar kullanılıyor bunuda merak ediyorum bunlar faydası nedir burda ne amaçla kullanılıyor sürekli bir yerlerde karşıma çıkıyor kolleksiyonlarda kitaplarda IEnumerable  ve IEqualityComparer bunların ne iş yaptıgı konusunda bilgi verilmemiş ama kullanılıyor bu yapının mantıgını bilmek lazım sonra interface mi baksam halen karışık geliyor bana interface 
    29 Haziran 2016 Çarşamba 23:37
  • Önay Bey IEnumerable  ve IEqualityComparer Arka Planda ne iş yapıyorlarda bunlar kullanılıyor bunuda merak ediyorum bunlar faydası nedir burda ne amaçla kullanılıyor sürekli bir yerlerde karşıma çıkıyor kolleksiyonlarda kitaplarda IEnumerable  ve IEqualityComparer bunların ne iş yaptıgı konusunda bilgi verilmemiş ama kullanılıyor bu yapının mantıgını bilmek lazım sonra interface mi baksam halen karışık geliyor bana interface 

    Hç bir iş yapmıyorlar. Sadece belirli methodların o interface'i uygulayan class'lar için MUTLAKA olduğunu GARANTİ altınaalıyorlar.

    Örneğin IEqualityComparer uygulanmış bir arayüz mutlaka ama mutlaka Equals ve GetHashCode methodlarını içerir. Bu sebeble tüüüm IEqulalityComparer  uygulanmış sınıflar @Önay'ın örneklediği BirdenFazla methodunun ikinci parametresi olabilirler. Aksi durumda her class için ayrı bir BirdenFazla methodu yazman gerekirdi.

    Kaldı ki bu methodu @önay kütüphane haline getirip herkesin kullanımına açabilir. Kullanmak isteyen de kendi sınıflarına bu arayüzü uygulayarak @önay'a hiç bir şey söylemeden kullanabilirler. Aynı senin piyasadan aldığın herhangi bir anteni televizyonuna takabilmen gibi. 



    30 Haziran 2016 Perşembe 06:30
  • "zorundasın" "mecbur" "olmak zorunda" kelimelerini anlayabiliyormusun? 

    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    30 Haziran 2016 Perşembe 06:46
    Moderatör
  • Önay Bey konu hakkında detaylı bilgiye ihtiyacım var mecbur oldugunu biliyorum ama bir projede nasıl kullanıldıgına bakmak lazım fizik matematik kimya  şeyleri Console ekranında yazması degil mantıklı bir proje laızm
    1 Temmuz 2016 Cuma 01:00
  • hmm. Yukarıdaki örnekleri anlamadıysan yapacak bişey yok.


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    1 Temmuz 2016 Cuma 03:43
    Moderatör
  • Deleted
    1 Temmuz 2016 Cuma 18:25
  • Verilen Cevaplar Konular Silinmiş Yeterli Degil Cevaplar 
    2 Temmuz 2016 Cumartesi 00:20