15. Arayüzler (Interfaces)

 Bilindiği üzere C# çoklu kalıtımı desteklemez. Bu gibi durumlarda da kurtarıcımız interface’ler olur. Peki nedir bu interface’in tam amacı interface’ler classlara özellik katar. Can do mantığıyla çalışır. Aşağıda interface mantığını bir örnek üzerinden anlatmaya çalışayım.

 Elimizde bir Hayvan classı var. Hayvan soyut çatı bir varlık olduğundan nesnesini türetmek pek mantıklı olmaz. Yani bir hayvan nesnesi ürettiğimizde yaşayan bir hayvan olmalı ama hangi hayvan? bu sebeple hayvan sınıfını abstract olarak tanımladık ve içerisine her hayvanda ortak olan özellikleri yazdık. Herhangi bir hayvan türü bu classtan türetildiğinde bu classtaki ortak hayvan özelliklerini tanımlamak zorundadır. Buna ilaveten her türün de (köpek, kedi , balina vs vs ) türlerinden gelen kendinerine has özellikleri olabilir. Buraya kadarki herşey abstract classın konu kapsamındaydı.

  Buna ilaveten bir de her hayvanda ortak olmayan türler arası ortak özellikler olabilir. Mesela Kedi ve köpeğin kendi arasında ortak özellikleri olabilir veya balina ve köpekbalığının kendi arasında ortak özellikleri olabilir. Aşağıda IYuzebilir, IUcabilir ve IAvlanabilir adında interfacelerimiz tanımlanmıştır. İnterface bir class değildir. Bu sebeple tanımında class ifadesi yoktur. Interfacelerin isimlerinden de anlayabileceğiniz üzere eklendikleri classa özellik, nitelik katarlar. Bizim IYuzebilir i eklediğimiz class yüzebilme özelliğine, IUcabiliri eklediğimiz class uçabilme özelliğine sahip olacaktır. Bu özellikler her hayvanın ortak özellikleri olmadığı için abstract hayvan classında tanımlanmamıştır ancak türler arası ortak özellik olduğundan interface olarak tanımlanmıştır yani biz uçmasını istediğimiz türlere bu interfaceleri implemente ederiz.

Bir arayüz üyesi her zaman dolaylı olarak public özelliktedir ve herhangi bir erişim değiştiricisi tanımlanamaz. Bir arayüzü uygulamak onun tüm elemanlarını public olarak kullanılmasına olanak sağlamak anlamına gelir.

  • Interface’ler de Abstract sınıflar gibi new ile oluşturulamazlar
  • İçi dolu metot bulunduramazlar
  • public static final değişkenler dışında herhangi bir değişken bulunduramazlar
  • Bir sınıf birden fazla interface’den türeyebilir
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

 namespace ConsoleApp3
 {
    class Program
    {
       static void Main(string[] args)
       {

       Console.ReadKey();
      }
 
  }
     //Her hayvan türünde ortak olarak bulunacak property ve metotları içerir. Kendi nesnesi yaratılamaz.
    abstract class Hayvan 
    {  
        public abstract int Yasi { get; set; }
        public abstract string Renk { get; set; }

        public abstract void HareketEt();
     }
    
    //Köpek bir hayvandır ve hayvan özelliklerini barındırır ve avlanabilir. Avlanabilme köpeğin türünün özelliğidir.
    class Kopek : Hayvan, IAvlanabilir  
    {
        //Abstract hayvan classından gelen propertyler
         public override int Yasi { get; set; } 
         public override string Renk { get; set; }
 
         public string isim { get; set; }
   
        //IAvlanabilir interfacesinden gelen metod
        public void Avlan()  
        {
          throw new NotImplementedException();
        }
    
        //Abstract hayvan classından gelen metot
         public override void HareketEt() 
         {
           Console.WriteLine("Köpek koştu");
         }

         public void Havla()
         {
           Console.WriteLine("Havladı");
         }
     }
   
   //Kuş bir hayvandır ve hayvan özelliklerini barındırır ve uçabilir. Uçma kuş türünün özelliğidir.
    class Kus : Hayvan, IUcabilir  
    { 
         //Abstract hayvan classından gelen propertyler
         public override int Yasi { get; set; }  
         public override string Renk { get; set; }
    
         //IUcabilir interfacesinden gelen property
         public int UcusHizi { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } 
         public string Cins { get; set; }

         //Abstract hayvan classından gelen metot
         public override void HareketEt() 
         {
           Console.WriteLine("Kuş uçtu");
         }

         public void Öt()
         {
          Console.WriteLine("Öttü");
         }
     }

    //Balina bir hayvandır ve hayvan özelliklerini barındırır ve yüzebilir. Yüzme balina türünün özelliğidir.
    class Balina : Hayvan , IYuzebilir 
    {
       //Abstract hayvan classından gelen propertyler
       public override int Yasi { get; set; }   
       public override string Renk { get; set; }

      //IYuzebilir interfacesinden gelen metotlar
       public int YuzmeHizi { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
       public int YuzmeSekli { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
       public int SualtindaKalmaSüresi { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
 
       public override void HareketEt()
       {
 
       }
    }
  
    //Kopekbaligi bir hayvandır ve hayvan özelliklerini barındırır ve yüzebilir. Yüzme Kopekbaligi türünün özelliğidir.
    class Kopekbaligi : Hayvan, IYuzebilir
    { 
        //Abstract hayvan classından gelen propertyler
        public override int Yasi { get; set; } 
        public override string Renk { get; set; }
     
        //IYuzebilir interfacesinden gelen metotlar
        public int YuzmeHizi { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
        public int YuzmeSekli { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
        public int SualtindaKalmaSüresi { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }

       public override void HareketEt() /Abstract hayvan classından gelen metot
       {
 
       }
   } 
  
    interface IYuzebilir
    {
        int YuzmeHizi {get; set;}
        int YuzmeSekli {get; set;}
        int SualtindaKalmaSüresi {get; set;}  
    }
   
    interface IUcabilir
    {
       int UcusHizi {get; set;}
       
       void Uc();         
    
    }

    interface IAvlanabilir
    {   
        void Avlan();
    }
}

Interfacelerin kullanımının önemli bir şekli , yazılım mimarları belli başlı şablonları,interfaceleri oluşturur. Sizin yapmanız gereken gerekli interfaceleri implemente edip içini doldurmak olur.

     İnsan :  IKosabilir  ,    IOkuyabilir  ,   IYuzebilir

Mesela engelli bir insan classına ihtiyacımız varsa IKosabiliri  veya gözme engelli bir insan classı için IOkuyabiliri implemente etmeyip bunu elde edebiliriz.