sanal metot etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
sanal metot etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

Sanal Metotları Uygulamak [13]

Sanal metotların gücünü daha iyi kavramak için bu metotları TwoDShape sınıfına uygulayacağız. önceki örneklerde, TwoDShape'ten türetilen her sınıf, area() adında bir metot tanımlamaktaydı. Bu kullanım bize bir fikir verir: area()'yı TwoDShape sınıfının bir sanal metodu yapmak çok daha iyi olabilir. Bu sayede, türetilmiş sınıfların her biri area()'yı devre dışı bırakabilir ve sınıf içinde belirtilen şeklin alanının nasıl hesaplandığını da tanımlayabilir. Aşağıdaki program bunu gerçekleştirir. Kolaylık sağlamak için TwoDShape'e ayrıca bir de isim özelliği eklenmektedir. (Bu, sınıfları göstermeyi kolaylaştırır.)

Sanal Metotlar ve Devre Dışı Bırakma (Overriding) [11]

Sanal metot, temel sınıf içerisinde virtual olarak deklare edilen ve bir veya daha fazla türetilmiş sınıf içinde yeniden tanımlanan bir metotdur. Böylece, her türetilmiş sınıf bir sanal metodun kendine özgü bir versiyonuna sahip olabilir. Sanal metotlardan biri bir temel referansı tarafından çağrıldığında ortaya çıkan durum ilginçtir. Bu durumda, referans tarafından referansta bulunulan nesnenin tipine bağlı olarak c#, söz konusu metodun hangi versiyonunun çağrılacağını belirler ve bu belirleme çalışma zamanında gerçekleştirilir.
Yani, farklı nesnelere referansta bulunuluyorsa sanal metodun farklı versiyonları çalıştırılır. Bir başka deyişle, sanal metodun hangi versiyonunun çalıştırılacağını belirleyen referansta bulunan nesnenin tipidir. (referansın tipi değildir.) Dolayısıyla, eğer bir temel sınıf bir sanal metot içeriyorsa ve bu temel sınıftan başka sınıflar turetilmişse, bu durumda bir temel sınıf referansı aracılığıyla farklı nesne tiplerine referansta bulunulurken sanal metodun farklı versiyonları çalıştırılır.