Hiding vs Overriding

HidingFace Geçen gün ofiste, aramızda yaptığımız teknik bir konuşmada Method Hiding ile Method Overriding arasında ne fark olduğu gündeme geldi. Zaman geçmiş herhalde pek hatırlayan olmadı. Ama içimizden de şöyle geçiyor; “bi farkı var ki Microsoft koymuş bunları” diye.

Şöyle bir onbeş dakikalık araştırma sonucunda hatırlayıverdik. Efendim şöyle:

Bilindiği gibi polymorphism diye birşey var oop de. Yani nesnelere “… gibi davranma” özelliği verebilme. Klasik oop örnekleri ile örneklemek istersek:

İki tane sınıfımız olsun, biri diğerinden türesin;

class Animal
{
    public virtual void Walk()
    {
        Console.WriteLine("Animal is walking.");
    }
}
class Cat : Animal
{
    public override void Walk()
    {
        Console.WriteLine("Cat is walking.");
    }
}

Ve şimdi bu sınıflarımızı kullanalım:

static void Main(string[] args)
{
	Animal animal = new Cat();
	animal.Walk();
}

Alacağımız çıktı şöyle olacak tahmin ettiğiniz gibi:

Cat is walking.

Şimdi override edeceğimize methodu hide edelim bakalım dünyada neler değişiyor:

class Cat : Animal
{
	public new void Walk()
	{
		Console.WriteLine("Cat is walking.");
	}
}

Şimdiki çıktımız ise şöyle oluyor:

Animal is walking.

Soru : Neden?

Şöyle özetleyebiliriz; methodu override ettiğimiz zaman framework Animal tipinde (Cat tipinde değil) bir nesnenin Walk methodunu çağırırken, içindeki bir tablodan (tablo olduğunu düşünelim basitçe) bu method, bu nesnenin sınıfı tarafından override edilmiş mi diye bakar. Eğer override edilmiş ise Animal sınıfının Walk methodu yerine o methodu çalıştırır.

Eğer override edilmeyip hide edilmişse, o zaman o tabloda bu kayıt bulunmaz ve Animal sınıfının Walk methodunu çağırır. Sizin nesneniz aslında Cat sınıfının bir nesnesidir ancak Walk methodu Animal sınıfının Walk methodu oluverir.

Soru : Peki niye böyle birşey yapalım? Yani niye methodu hide edelim?

Bu sorunun cevabına geçmeden statik tip ve dinamik tip ayrımını bilmek gerekiyor. Şuradan bir göz atabilirsiniz.

OOP kurallarına ters bir durum olduğu malum. Ancak diyelim ki şöyle elzem bir durum söz konusu:

Benim nesnemin statik tipi Cat olacaksa Cat sınıfına yazılan Walk methodu, yok eğer statik tipi Animal olacaksa yani Cat nesnesi Animal gibi davranacaksa Animal sınıfındaki Walk methodu çalıştırılsın.

İşte böyle bir isteğimiz olursa -ki benim şimdiye kadar olmadı- method hiding burada yardımınıza yetişir.

Posted on 07/01/2010, in software engineering, yazılım mühendisliği and tagged , , , . Bookmark the permalink. Yorum yapın.

Yorum yapın

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Değiştir )

Twitter picture

You are commenting using your Twitter account. Log Out / Değiştir )

Facebook photo

You are commenting using your Facebook account. Log Out / Değiştir )

Connecting to %s

Follow

Get every new post delivered to your Inbox.