Friday, January 15, 2016

Metot İptal Etme (Overriding) vs Metot Gizleme - Method Overriding vs Method Hiding

Metot iptal etme veya üzerinde yazma kalıtım bırakmada bir metodun daha gelişmiş özelliklerle genişletilmesi gerektiğinde kullanılır. Metot gizleme ise iptal etmeye müsait olmayan bir metot türetilen sınıfta aynı isimde tanımlandığında devreye girer. "new" anahtar kelimesi kullanılarak gizleme yapıldığına kesinlik kazandırılabilir. Gizleme yapıldığı konusunda kesinlik kazandırılmaz ise gizleme geçerlidir fakat derleyici tarafından uyarı yapılır. Aşağıdaki Class2 sınıfı Class1 sınıfından türemiştir. "getName" metodu türetilen sınıfta iptal edilmiştir.

public class Class1
    {
        public Class1() { }

        public virtual void getName()
        {
            Console.WriteLine("Class1");
        }

    }

    public class Class2 : Class1
    {
        public Class2() { }

        public override void getName()
        {
            Console.WriteLine("Class2");
        }
    }

Bu sınıflar aşağıdaki kod ile çağrıldığında şu sonuçlar elde edilmiştir:

Class1
Class2
Class2
 
    class Program
    {
        static void Main(string[] args)
        {
            Class1 c1 = new Class1();
            c1.getName();

            Class1 c2 = new Class2();
            c2.getName();

            Class2 c3 = new Class2();
            c3.getName();

            Console.ReadLine();
        }
    }

Görüldüğü üzere ilk c1 nesnesi hafıza alanında Class1 sınıfı referans alınarak oluşturulduğu için iptal etme işlemi uygulanması. Fakat diğer ikisinde Class2 nesnesi referans alınarak oluşturulduğu için iptal etme işlemi geçerli oldu.

Bazı durumlarda, özellikle de ebeveyn sınıfının eski versiyonunun kaybedilmesinin istenmediği durumlarda gizleme kullanılabilir.

public class Class1
    {
        public Class1() { }

        public void getName()
        {
            Console.WriteLine("Class1");
        }

    }

    public class Class2 : Class1
    {
        public Class2() { }

        public new void getName()
        {
            Console.WriteLine("Class2");
        }
    }

Main metodu tekrar çalıştırıldığında aşağıdaki sonuçlar elde edilir:

Class1
Class1
Class2

Sonuçtan da anlaşılabileceği gibi iptal etme işlemi artık geçerli olmadığı için c2 nesnesi üzerinde Class1 tipindeki referans değişkeni üzerinden erişim yapıldığında Class1 üzerindeki fonksiyon kullanılmıştır.






No comments:

Post a Comment