Makale Özeti

Interface (arayüz) ‘ ler, kendilerini implement etmiş olan diğer class ‘ lar (sınıflar) için hazır metod, özellik vb. gibi üyeleri içlerinde barındıran class ‘ lardır. Ancak interface ‘ lerin barındırdıkları bu öğeler içerisinde kod yer almaz. Interface içindeki kodlar, interface ‘ i implement etmiş olan class ‘lara yazılır. C# dilinde, bir class sadece tek bir class ‘ tan miras alabilir. Bu yüzden interface ‘ lerin kullanılmasının en önemli sebeplerinden biri de C# ‘ da çoklu kalıtım işinin interface ‘ ler aracılığıyla gerçekleştiriliyor olmasıdır. Uygulamalar geliştikçe barındırdıkları class ‘ lardaki metod, event, özellik gibi öğelerin sayısında da artış olur. Bu da kodun zamanla karmaşıklaşmasına, hangi metodun ne için tanımlandığının karıştırılmasına ve anlaşılabilirliğin azalmasına yol açar. Bu yüzden yeni interface tanımlayarak veya mevcut interface ‘ leri birbirlerinden türeterek class ‘ ların bu interface ‘leri implement etmesi sağlandığında daha düzenli ve anlaşılabilir bir yapı elde edilir.

Makale

Merhabalar,

 

Interface (arayüz) ‘ ler, kendilerini implement etmiş olan diğer class ‘ lar (sınıflar) için hazır metod, özellik vb. gibi üyeleri içlerinde barındıran class ‘ lardır. Ancak interface ‘ lerin barındırdıkları bu öğeler içerisinde kod yer almaz. Interface içindeki kodlar, interface ‘ i implement etmiş olan class ‘lara yazılır.
 
C# dilinde, bir class sadece tek bir class ‘ tan miras alabilir. Bu yüzden interface ‘ lerin kullanılmasının en önemli sebeplerinden biri de C# ‘ da çoklu kalıtım işinin interface ‘ ler aracılığıyla gerçekleştiriliyor olmasıdır.
 
Uygulamalar geliştikçe barındırdıkları class ‘ lardaki metod, event, özellik gibi öğelerin sayısında da artış olur. Bu da kodun zamanla karmaşıklaşmasına, hangi metodun ne için tanımlandığının karıştırılmasına ve anlaşılabilirliğin azalmasına yol açar. Bu yüzden yeni interface tanımlayarak veya mevcut interface ‘ leri birbirlerinden türeterek class ‘ ların bu interface ‘leri implement etmesi sağlandığında  daha düzenli ve anlaşılabilir bir yapı elde edilir.
 
Interface ‘ ler kod bloğunda aşağıdaki gibi Interface kelimesi kullanarak tanımlanır. Interface ‘ ler isimlendirilirken başlarında I harfi kullanılarak isimlendirilir.
 
interface IKisi
    {
  
    }
 
Interface ‘ ler içerisinde tanımlanabilecek ve tanımlanamayacak öğeler vardır.  Bu öğelerden tanımlanabilen olanlar;
 
·         Property (Özellik),
·         Method (Metod),
·         Event (Olay),
·         Indexer (Indexleyici)
 
 
Arayüzler ile tanımlanamayacak öğeler ise;
 
·         Constructor (Yapıcı Metodlar),
·         Destructor (Yıkıcı Metodlar),
·         Fields (Alanlar)
 
Interface ‘ lere öğeler aşağıdaki gibi tanımlanır. Daha önce de belirtildiği gibi interface ‘ ler sadece yukarıdaki tanımlanmasına izin verilen öğeleri tanımlarlar. Bu öğeler dışında herhangi bir kod içermezler.
 
   interface IKisi
    {
        int Yas //int türünde property tanımı
        { get; set;}
 
string Isim //string türünde property tanımı
        { get; set; }
           
        void Yaz(); //metod tanımı
       
        string[] dizi //array tanımı
        { get; set; }
          
    }  
       
   
 
Interface öğeleri tanımlanırken görüldüğü üzere değişkenlerde public, private, protected gibi modifier ‘ lar kullanılmadı. Çünkü bir interface ‘ in sahip olduğu tüm öğeler public olarak kabul edilir ve tanımlamalarda modifier ‘ lar kullanılırsa kod derlenirken bunun gibi bir hata alınır: “The modifier 'private' is not valid for this item”. Interface elemanlarının tanımlanmasıyla ilgili bir diğer önemli nokta ise static olarak tanımlanamayacaklarıdır.
 
Ayrıca bir interface başka bir interface veya interface ‘ lerden türetilebildiği halde, bir class ‘ dan türetilemez.
 
interface IInsan
    {
    //...
    }
 
class Insan
    {
    //...
    }
 
interface IKisi: IInsan
{
     //...
}
 
Yukarıdaki gibi bir türeme yapıldığında hata alınmaz fakat aşağıdaki gibi bir interface ‘ i  class ‘ dan türetmeye çalışınca bu hata alınır: “Type 'Insan' in interface list is not an interface” 
 
 
interface IKisi: Insan
{
      //...
}
 
Interface ‘ leri class ‘ lara uygularken interface içindeki bütün öğelerin class ‘ larda kullanılması gerekir. Örneğin Calisan adında bir class yaratıldığı, class ‘ ta IKisi interface ‘ inin implement edildiği fakat IKisi üyelerinden Isim özelliğinin kullanılmadığı varsayılırsa şu hata alınır: “Arayuzler.Calisan' does not implement interface member 'Arayuzler.IKisi.Isim”
 
.Net 2005 ‘ te tanımlanmış olan bir interface ‘ in öğelerini implement edilecek sınıf içine getirmek için interface ismini yazdıktan sonra sağ tıklayarak açılan menüde Implement Interface veya Implement Interface Explicitly seçilir.
 
 
 
Burada Implement Interface ve Implement Interface Explicitly arasındaki farkı belirtmekte yarar var. Örnek olarak Kisi adlı bir class olsun ve  ICanli interface ‘ ini normal olarak aşağıdaki gibi implement etsin.
 
public interface ICanli
    {
        void Yuru();
        int Yas
        { get; set;}
}
 
 
public class Kisi : ICanli
    {
        #region ICanli Members
 
        public void Yuru()
        {
            //...
        }
        int mYas;
        public int Yas
        {
            get
            {
                return mYas;
            }
            set
            {
                mYas = value;
            }
        }
 
        #endregion
    }
 
 
Kisi class ‘ ı ICanli interface ‘ ini aşağıdaki gibi explicit olarak implement eder.
 
 public class Kisi : ICanli
    {
 
        #region ICanli Members
 
        void ICanli.Yuru()
        {
           //...
        }
 
        int mYas;
        int ICanli.Yas
        {
            get
            {
                return mYas;
            }
            set
            {
                mYas = value;
            }
        }
 
        #endregion
    }
 
Görüldüğü üzere interface ‘ ler explicit olarak implement edildiklerinde üyeleri public olarak tanımlanmazlar ve bu da üyelerinin ancak interface instance ‘ ından çağrılabilmelerini gerektirir. Öte yandan interface normal olarak tanımlandığında kendisini implement etmiş olan class ‘ ın instance ‘ ından çağrılabilirler.
 
//Explicit: interface member ' lari sadece interface ' in instance ' indan cagirilabilirler.
            Kisi k = new Kisi();
            ICanli c = (ICanli)k;
            c.Yuru();
 
            //Normal: interface member ' lari class instance ' indan cagirilabilirler.
            Kisi k = new Kisi();
    k.Yuru();
 
Bu sayede çeşitli farklı tipteki nesnelere Yuru özelliği kazandırılabilir. Örneğin Köpek class'ındaki yürü metodu ile Insan class'ındaki Yuru metodu farklı şekillerde işliyor olmasına rağmen interface ile bu özellik kazandırıldığından bu iki nesneninde yürüyebilir olduğunu anlamak Interface'e cast ederek mümkündür ve Interface'e cast ederek metodları çalıştırmak, base class'a cast ederek çalıştırmaktan daha performanslıdır.
 
Bir class ‘ ın bir interface ‘ i implement edip etmediğinin kontrolü iki türlü yapılabilir.
Yukarıdaki örnek üstünden gidecek olursak birinci yol,
 
  if (k.GetType().GetInterface("ICanli") != null)
            {
                //...
    }
 
şeklindedir. Kontrolü yapmanın diğer yöntemi ise aşağıdaki gibidir.
 
   if (k is ICanli)
            {
                //...
    }
 
Şimdi TextBox sınıfını inherit eden ve interface ‘ i olan bir User Control yazalım. Öncelikle interface ‘ i yazalım.
 
public class TextBoxInterface
    {
        public interface ITextBox
        {
 
            int Genislik //interface ' i implement edecek olan textbox ' in Genislik ozelligi tanimlanir.
            { get; set; }
               
            int Yukseklik //Yukseklik ozelliginin degistirilmesini istemedigimiz icin readonly tanimlayalim
            { get; }
               
           System.Drawing.Color ArkaPlanRengi //Textbox ' in arkaplan rengi ozelligi
            { get; set; }
               
void ArkaPlanRengiDegistir(); //TextBox ' in arkaplan rengini degistirecek
          void UpperCaseYap(); //TextBox ' a yazilan karakterleri buyuk harfe donusturecek
        }
     }
 
 
Sıra ITextBox interface ‘ ini uygulayacağımız TextBox ‘ ı oluşturmaya geldi.
 
public class TextBox2 : System.Windows.Forms.TextBox, ITextBox
         {
 
  }
 
TextBox2 sınıfı System.Windows.Forms.TextBox sınıfını inherit alacak ve biraz önce yazdığımız ITextBox interface ‘ ini implement edecek.
 
Kodu .Net 2005 ortamında yazıyorsak ITextBox yazısının üstüne gelip sağ tıklayıp Implement Interface – Implement Interface ‘ e tıklayarak interface metodlarının oluşturduğumuz class ‘ a gelmelerini sağlayabiliriz.
 
public class TextBox2 : System.Windows.Forms.TextBox, ITextBox //ITextBox implement edildi
    {
 
        #region ITextBox Members
 
        //Class icinde verilerin tutulacagi private degiskenler tanimlandi
        private int mGenislik;
        private int mYukseklik;
        private System.Drawing.Color mArkaPlanRengi;
 
        public int Genislik
        {
            get
            {
                throw new Exception("The method or operation is not implemented.");
            }
            set
            {
                throw new Exception("The method or operation is not implemented.");
            }
        }
 
        public int Yukseklik
        {
            get { throw new Exception("The method or operation is not implemented."); }
        }
 
        public System.Drawing.Color ArkaPlanRengi
        {
            get
            {
                throw new Exception("The method or operation is not implemented.");
            }
            set
            {
                throw new Exception("The method or operation is not implemented.");
            }
        }
 
        public void ArkaPlanRengiDegistir()
        {
            throw new Exception("The method or operation is not implemented.");
        }
 
        public void UpperCaseYap()
        {
            throw new Exception("The method or operation is not implemented.");
        }
 
        #endregion
  }
 
Şimdi sıra metod ve özelliklere kod yazmaya geldi.
 
   public class TextBox2 : System.Windows.Forms.TextBox, ITextBox
    {
 
        #region ITextBox Members
 
        private int mGenislik;
        private int mYukseklik;
        private System.Drawing.Color mArkaPlanRengi;
 
        public int Genislik
        {
            get
            {
                return mGenislik;
            }
            set
            {
                mGenislik = value;
                this.Width = value;
            }
        }
 
        public int Yukseklik
        {
            get { return mYukseklik; }
        }
 
        public System.Drawing.Color ArkaPlanRengi
        {
            get
            {
                return mArkaPlanRengi;
            }
            set
            {
                mArkaPlanRengi = value;
            }
        }
 
        public void ArkaPlanRengiDegistir()
        {
            this.BackColor = ArkaPlanRengi;
        }
 
        public void UpperCaseYap()
        {
            this.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper;
        }
 
        #endregion
    }
 
Kodu derledikten sonra Toolbox ‘ ta kontrolün oluşturulduğunu görürüz.
 
Kontrolü bir forma ekleyerek kullanmaya başlayabiliriz.
 
 
 
Formun Load ve TextBox2 ‘ nin KeyPress event ‘ lerine aşağıdaki gibi kodu yazabiliriz.
 
      private void Form2_Load(object sender, EventArgs e)
        {
            textBox21.ArkaPlanRengi = Color.Red;
            textBox21.ArkaPlanRengiDegistir();
            textBox21.Genislik = 200;
        }

 

       private void textBox21_KeyPress(object sender, KeyPressEventArgs e)
        {
            textBox21.UpperCaseYap();
        }

 

 

 

Uygulamayı çalıştırdığımızda form yukarıdaki gibi yüklenecektir ve textbox ‘ ın içine yazılanlar büyük harf olacaktır.

    Işıl ORHANEL.