Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

C# Interface(Arayüz)

Şimdi 3 tane interface oluşturalım.

    interface IA
    {
        void Metod1();
        void Metod2();
    }
    interface IB
    {
        void Metod3();
        void Metod4();
    }
    interface IC
    {
        void Metod4();
        void Metod5();
    }
    interface ID:IC
    {
        void Metod6();
        void Metod7();
    }

Şimdi yukarıdaki IB ce IC interfacelerini inceleyiniz.Dikkat ederseniz ikisinde de aynı isimde Metod4() vardır.Ve ID interfacei IC interfaceinden kalıtım almaktadır.Bir interface, başka bir ya da daha fazla interfaceden kalıtım alabilir.Bu durumda bu interface , kalıtım aldığı interface içindeki elemanları uygulamak zorunda değildir.Fakat, ID interfaceinden kalıtım alan bir sınıf bu durumda hem IC den hem de ID den elemanlarını mecbur uygulamak zorundadır.Interfaceleri birbirinden türeterek programımızda genişletme işlemini kolayca sağlayabiliriz.

Şimdi şuna dikkat edelim.IB cs IC interfaceleri içinde Metod4() imzasına sahip metodlar vardır.Yani ikisinde de aynı isimde metod vardır.IB ve IC den aynı anda kalıtım alan sınıflar içinde Metod4() olduğu kesindir.Ama bunun hangi interface tarafından uygulattırıldığı kesin değildir.İşte bu gibi yapılara(aynı isimde, değişik interfacelerde tanımlanan yapılara) name hiding (isim saklama) ya uğramış yapılar diyoruz.
Şimdi bir AClassi.cs isminde class oluşturalım ve IB ve IC interfacelerinden kalıtım almasını sağlayalım.Sonrada kalıtım aldığı sınıflardan elemanları implement yapalım.

    class AClassi:IC,IB
    {
        public void Metod4()
        {
            throw new NotImplementedException();
        }
        public void Metod5()
        {
            throw new NotImplementedException();
        }
        public void Metod3()
        {
            throw new NotImplementedException();
        }
    }

Yukarıda gördüğünüz gibi öncelikle IC den implement yapıyorum, Metod4() ve Metod5() geliyor.Sonra IB den implement yapıyorum Metod4() var olduğu için sadece Metod3() geliyor.Şimdi ben bu Metod4() ün IC interfaceinemi yoksa IB interfaceinemi ait olduğunu nasıl anlayacağım.(name hiding)Tabikide anlayamayacağım.Bu sorunu çözmek için şu yolu izliyoruz.

Interface üzerine gelince mavi imleçten bu sefer Explicitly implement interface ‘ISeriler’ seçeneğini seçiyoruz.IB ve IC için Explicitly implement yapıyoruz.

    class AClassi:IC,IB
    {
        void IC.Metod4()
        {
        }
        void IC.Metod5()
        {
        }
        void IB.Metod3()
        {
        }
        void IB.Metod4()
        {
        }
    }

Gördüğünüz gibi IB ve IC interfalerini bu classa explictly olarak implement ettim.Eğer bir interface explicitly implement edilirse, içindeki yapılar private olarak alınır.Ve görüldüğü gibi hangi interfaceden geldikleri de bellidir.Böylece name hiding aşılmış olur.

Fakat explicit implementten dolayı elemanlar private gelecek ve bu class nesneleri üzerinden erişelemeyecek.Eğer tutup başlarına manuel olarak public yazmaya kalkarsak da hata veriyor.Yani manuel olarak elle hiç bir müdahale edemiyoruz.İşler iyice çığırından çıkıyor gibi ama sakın telaşlanmayın.

Bu durumda şu işlemi yapacağız.

 Yanda gördüğünüz gibi AClassindan bir nesne oluşturuyoruz ve bunu IC interface ineden oluşturulan nesneye(nesnem) geçiriyoruz.nesnem. dediğimiz zaman Metod4() ve Metod5 i görüyoruz.Dikkat ederseniz Metod4 ün IC interfaceinden geldiğini göreceğiz.Aynı şekilde aşağıdaki satırıda inceleyiniz.
   Yanda gördüğünüz gibi , yukarıda yaptığımızın aynısını IB interfacei içinde yapıyoruz.Ve Metod4() ün IB interfaceinden geldiğini görüyoruz.

Yukarıdaki duruma dikkat edersek eğer, AClassi içinde tanımlı olan metodlar çok biçimliliği kullandığımız halde gözükmektedirler.Bunun sebebini sormayın 🙂 Interface de bu şekilde bir kullanım vardır.

Şimdi diğer sayfada başka bir yöntem daha gösterip Interface mevzusunu kapatacağım.Benimde başım çatladı 🙂

Bunlar da hoşunuza gidebilir...

1 Cevap

  1. 10 Mart 2017

    […] eğer Interface’ler üzerine zamanında yazmış olduğum makalemin name hiding ile ilgili şu adresteki bölümü okumanızı ve bu makaleye öyle devam etmenizi tavsiye […]

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir