C# OOP Deep Dive -1 (Runtime Polymorphism ve Cut Off Relations)

24 Ağustos 2014
Posted by Çağatay Yıldız
1766 Views
C#

Günümüz yazılım dillerinde nesne tabanlı dillerin piyasadaki hakimiyeti ve buna paralel olarak gelişen kimi teknolojiler yazılımcıların OOP konusunda hakimiyetini biraz daha zorunlu hale getirmiştir. C# 6.0 da gelen kimi yenilikler de OOP programlama konusundaki yönelimin sonuçları olmuştur. C# 6.0 ile gelen yenilikleri yakın bir zamanda inceleyeceğiz. Bu yeni serimizin ilk yazısında virtual metotların arasındaki ilişkinin nasıl kesilebileceği polimorfik yapıda ne gibi değişiklikler yapacağımıza bakalım. Öncelikle birbiriyle bağlantılı 3 class inşa edelim ve içerisine metotlarımızı ekleyelim. Oluşturduğumuz classlar ve içerisinde bulunan metotlar şu şekilde:

     class Canli
    {
       public  virtual string Vur()
        {
            return "normal vuruş";
        }
    }
    class Ninja : Canli
    {
        public virtual new string Vur()
        {
            return "Ninja vuruşu";
        }
    }
     class SuperNinja : Ninja
    {
        public override string Vur()
        {
            return "Süper Ninja vuruşu";
        }
    }
            Ninja n = new Ninja();
            SuperNinja sn = new SuperNinja();

Oluşturulan örnekte Canli class ında vur metodu virtual olarak tanımlanmakta. Böylelike miras verdiği classlardan herhangi birinde dilediğimiz gibi değiştirilmesine izin verilmekte. Fakat ben metodun kendisini eğer ara katmanda kökten olarak değişirip alt katmanlara gelen metodun default değerini inşa etmek istersem Ninja class ında olduğu gibi new anahtar kelimesini kullanmak zorundayım. Böylelikte Ninja dan miras alan bütün classlardaki Vur metodu default olarak “Ninja vuruşu” değerini döndürecektir. Dilersek SuperNinja class ında olduğu gibi metodu tekrar override edebiliriz. Instance aldığımız class yapısını değiştirdiğimiz takdirde durum farklılaşacaktır.

            Canli n = new Ninja();
            Ninja sn = new SuperNinja();

            MessageBox.Show(n.Vur());
            MessageBox.Show(sn.Vur());

Yukarıdaki örnek bana çıktı olarak önce Canli class ında bulunan vur metodunu daha sonra SuperNinja classında bulunan vur metodunu çalıştıracaktır. Breakpointle kod bloğunu takip ettiğimiz takdirde önce canli classına daha sonra SuperNinja classına metodu çalıştırmak için girecektir. Böylelikle override ettiğimiz metot çalışacak fakat new ile üretilen metot(Ninja class ında) çalıştırılmayacaktır. Miras aldığı Canli classındaki metot çalıştırılacaktır.
Son olarak Ninja class ında bulunan Vur metodunun içeriğini aşağıdaki gibi değiştirdim.

    class Ninja : Canli
    {
        public override string Vur()
        {
            ((Canli)this).Vur();
            return "Ninja vuruşu";
        }
    }

Vur metodunu override edip bu metot tetiklendiği takdirde Canli classında bulunan vur metodunu tetiklemesini istedim. Bu durumda program sonsuz döngüye girecektir çünkü canli metodundaki vur metodunu tetiklemeden Ninja class ı içerisindeki Vur metodunu tetikleyecektir.Böylelikle sonsuz döngü oluşacaktır.