C# Interface(Arayüz) Kullanımı



Interface kelimesinin çevirisi "Arayüz"dür. Interface başka sınıflar için rehberdir. Bu şu anlama gelir Interface içinde hiç bir şekilde kod yazılarak işlem yapılmaz, mesela topla metodu yazıp iki sayı toplayan kod yazamayız. Peki işlem yapmıyorsak bu bizim ne işimize yarıyor? Interface'in anlamını yazarken başka sınıflar için rehberdir demiştim. C#'ta bildiğiniz gibi çoklu kalıtım söz konusu değil. Eskiden C++'ta bu olsa bile zamanla proje büyüdükçe kodun okunurluğunu yok ettiğini düşünen Microsoft dil geliştiricileri C#'ta bu özelliği kaldırmışlar. Yani C#'ta bir class sadece bir class'ı inherit edebilir. Ama bunun yanında birden çok Interface'i inherit etmesine izin verilmiştir.


Interface Tanımlama :

Interface tanımlarken nasıl class tanımlarken class anahtar sözcüğünü kullanıyorsak bunda da "interface" anahtar sözcüğünü kullanıyoruz. Arayüz isminin başında I harfi kullanıldığına dikkat edin. Bu kullanılan sınıfın bir arayüz olduğunu anlamamıza yarayan bir isim kullanma tekniğidir. Bu sayede, sınıfların kalıtımsal olarak aldığı elemanların arayüz olup olmadığını daha kolayca anlayabiliriz.


Örnek bir interface tanımı:

public inteface IDeneme
{

}
Arayüzlerin Sahip Olabileceği Üyeler :

- Özellikler (properties)
- Metodlar (methods)
- Olaylar (events)
- İndeksleyiciler (indexers)


Arayüzlerin Sahip Olamayacağı Üyeler :

- Yapıcılar (constructors)
- Yokediciler (destructors)
- Alanlar (fields)

Herşeyden önce arayüzler ile ilgili en önemli kural onun bir rehber olmasıdır. Yani arayüzler sadece, kendisini rehber alan sınıfların kullanacağı üyeleri tanımlarlar. Herhangi bir kod satırı içermezler. Sadece özelliğin, metodun, olayın veya indeksleyicinin tanımı vardır. Onların kolay okunabilir olmalarını sağlayan ve çoklu kalıtım için tercih edilmelerine neden olan sebepte budur.


Interface Kullanırken Uyulması Gereken Kurallar :

1 Bir arayüz'ün tüm üyeleri public kabul edilir. Private, Protected gibi belirtiçler kullanamayız. Bunu yaptığımız takdirde örneğin bir elemanı private tanımladığımız takdirde, derleme zamanında şu hatayı alırız. "The modifier 'private' is not valid for this item"
2 Diğer yandan bir metodu public olarakta tanımlayamayız. Çünkü zaten varsayılan olarak bütün üyeler public tanımlanmış kabul edilir. Bir metodu public tanımladığımızda yine derleme zamanında şu hatayı alırız. "The modifier 'public' is not valid for this item"
3 Bir arayüz, bir yapı(struct)'dan veya bir sınıf(class)'tan kalıtımla türetilemez. Ancak, bir arayüzü başka bir arayüzden veya arayüzlerden kalıtımsal olarak türetebiliriz.
4 Arayüz elemanlarını static olarak tanımlayamayız.
5 Arayüzlerin uygulandığı sınıflar, arayüzde tanımlanan bütün üyeleri kullanmak zorundadır.

public interface IArayuz
{
            string ParametreGetir();
            int ParametreSayısı
            {
                        get;
                        set;
            }            

            string ParametreAdi
            {
                 get;
                 set;
            }
}

Yukarda görüldüğü gibi IArayüz tanıladık. Bu arayüzümüzde ParametreGetir() metodunu ve ParametreSayısı,ParametreAdi property'lerini tanımladık. Ve interface yaratma kurallarından bahsederken söylediğim gibi tanımlama dışında hiç bir kod parçacığı bulunmamaktadır. Şimdi bir class yazdığımız IArayuz arayüzünü inherit ederse bu iki propery'i ve bir metodu kullanmak zorundadır yoksa compile ederken hata alınır. Örnek bir kullanım yaparsak :

public class Bilgiler:IArayuz

            public int _deneme;
            public string ParametreGetir()

           {
               Console.WriteLine("Parametreler Hazır...");
           }
            public int ParametreSayısı
            {
                        get;
                        set;
            }            

            public string ParametreAdi
            {
                 get;
                 set;
            }
}

şeklinde IArayuz içinde tanımlamasını yaptığımız her üye bu class içinde kullanmalıdır.


Çoklu Kalıtım :


Çoklu kalıtımın bir önceki örneğimizde yaptığımız tanımlamadan hiç bir farkı yoktur. Böyle bir tamımlama yaparken düşünelim ki IArayüz'ün yanında IParametre diye ikinci bir Interface'imiz olsun BilgiGoster sınıfı bu iki arayüzüde inherit ediyorsa tanımlama şöyle olur : 


public class BilgiGoster:IArayuz,IParametre
{
    //Tanımlamalar
}


ve bu BilgiGoster tanımlama class'ı her iki Interface içinde tanımlanan tüm üyeleri kullanmak zorundadır. Peki ya bu iki Interface içinde ayni isme sahip metod varsa ne olacak? Örneğin metodumuzun ismi Kaydet(); olsun. Bu durumda sadece bir kere kullanmak yeterli olacaktır. Ama bu iki metod ayni görevi yapmıyorsa bu durumda


IArayuz.Kaydet()
{
}


IParametre.Kaydet()
{
}


şeklinde iki tanımlamayıda yapmak sorunumuzu çözecektir. Bu metodları program içinde çağırırkende şunu kullanırız :


BilgiGoster bg = new BilgiGoster();
IArayuz a = (IArayuz)bg;
IParametre p = (IParametre)bg;


a.Kaydet();
p.Kaydet();


şeklinde hangi arayüzdeki parametreyi kullanıcaksak onu çağırmayı sağlayabiliriz.


Bu yazımında sonuna geldik umarım yardımcı olmuşumdur. Hoşçakalın..

Yararlanılan Kaynaklar : CSharpNedir

5 yorum :