Overriding (Geçersiz kılmak)

Eyl 08, 2013

Nesne Yönelimli (Object Oriented) Programlama'da, ana sınıftaki bazı metodlara, o sınıftan türetilen yeni sınıflarda ihtiyaç duyulmayabilir ya da bu metodlar üzerinde değişiklikler yapılması gerekebilir. Bu durum genellikle yazılan kodun, bir temel sınıf ve bu sınıftan türetilmiş farklı sınıfları etkileyeceği zamanlarda ortaya çıkar ve Overriding (geçersiz kılma) kullanılarak çözülebilir. 

Overriding bir sınıfa ait bir metodun, o sınıftan türetilmiş bir sınıf içerisinde aynı isimli bir metod tanımlanarak, bu metodun temel sınıftaki metodun yerine geçirmeye denir. Bu işlem,bir metodun  aynı sınıftan türetilmiş  farklı sınıflarda farklı işlere yaramasını sağlar. Türetilmiş sınıfatki metodun adından önce override anahtar sözcüğü eklenerek temel sınıftaki metod geçersiz kılınır. Burada dikkat edilmesi gereken nokta iki metodun da aynı erişilebilirlik derecesine sahip olması gerekir ve bu erişilebilirlik derecesi private olamaz. Bir metodu override (geçersiz kılma) etmek için önce o metodun override edilmesine izin verilmesi gerekir. Bunun için iki yol vardır. Birincisi virtual ve ikincisi abstract anahtar kelimeleridir.

"Virtual" anahtar kelimesi temel sınıftaki metodun geçersiz kılınmasına izin verirken "abstract" anahtar kelimesi geçersiz kılma işlemini zorunlu kılar. Temel sınıftaki metodun "abstract" olarak tanımlanması için sınıfın da "abstract" olması gerekir ve abstract metodlar sadece declaration (bildirim) olarak tanımlanır. Implementation (uygulama) kısmı eklenmez ve bu kısım türetilen sınıflardaki metodlara bırakılır. Eğer türetilmiş sınıf ve metod da abstract ise override işlemi zorunlu değildir fakat daha sonra tekrar türetilip override (geçersiz kılma) edilmesi gerekir.

Türetilmiş ve override edilmiş bir metod herhangi bir  anahtar kelime eklemeden tekrar geçersiz kılınabilir. Bunu engellemek için sealed anahtar kelimesi kullanılır. Bu anahtar kelime sadece geçersiz kılınmış metodlarda işe yarar ve o metodun tekrar geçersiz kılınmasını engeller.

public abstract class vehicle
       {
            public int wheels;          
            public abstract void Definition();
            public void NoOfWheels(int w) 
            {
                wheels = w;
            }
            public abstract void WheelExp();
        }

vehicle sınıfı diğer sınıfların kendinden türeyeceği temel sınıftır. Bu yüzden "abstract" olarak tanımlanmıştır.

        public class bike : vehicle
        {
            public override void Definition()
            {
                Console.WriteLine("This is a bike.");
            }

            new public void NoOfWheels(int w)
            {
                wheels = 2;
            }

            public sealed override void WheelExp()
            {
                Console.WriteLine("It has 2 wheels.");
            }
              }

bike sınıfı vehicle sınıfından türetilmiştir. Burada WheelExp ve NoOfWheels metodları vehicle sınıfından farklıdır. Ayrıca WheelExp sınıfı "sealed" anahtar kelimesi ile geçersiz kılma işlemine kapalı hale getirilmiştir.

public class car : vehicle
        {
            public override void Definition()
            {
                Console.WriteLine("This is a car.");
            }

            new public void NoOfWheels(int w)
            {
                wheels = 4;
            }

            public sealed override void WheelExp()
            {
                Console.WriteLine("It has 4 wheeels.");
            }
        }

        public class pickup : car
        {
            public override void Definition()
            {
                Console.WriteLine("This is a pickup.");
            }
        }

Burada vehicle sınıfından car sınıfı, car sınıfından da pickup sınıfı türetilmiştir. Örnekte de görüldüğü gibi Definition metodu, geçersiz kılınmışbir metod olduğu için, "virtual" veya "abstract" anahtar kelimelerine ihtiyaç duyulmadan geçersiz kılınmıştır.