Bugünkü makkalemizde sanal metodların kalıtım içerisindeki rolüne bakacağız. Sanal metodlar, temel sınıflarda tanımlanan ve türeyen sınıflarda geçersiz kılınabilen metodlardır. Bu tanım bize pek bir şey ifade etmez aslında. O halde gelin sanal metodların neden kullanırız, once buna bakalım. Bu amaçla minik bir örnek ile işe başlıyoruz.
using System;
using System.Collections.Generic;
using System.Text;
namespace VirtualSample
{
class Base
{
public virtual void who()
{
Console.WriteLine(“Who() in Base”);
}
}
/// <summary>
/// Autor Orhan Türk
/// Article Virtual Metod Using
/// </summary>
class Derived1
: Base
{
new public void who()
{
Console.WriteLine(“Who() in derived1”);
}
}
class Derived2 : Derived1
{
//public override void who()
//{
// Console.WriteLine(“Who() in derived2”);
//}
}
/// <summary>
/// Kodumuz Temel isimli bir base class ve Tureyen isimli bir Derived Classvardır. Her iki sınıf içinde Yazdir isimli iki metod tanımlanmıştır. Main metodu içinde Temel sınıftan türettiğimiz bir nesneye ( baseOb
/// </summary> nesnesi) Tureyen sınıf tipinden bir nesneyi (drv nesnesi) aktarıyoruz. Ardından baseOb nesnemizin Who isimli metodunu çağırıyoruz.Sizce derleyici hangi sınıfın yazdır metodunu çağıracaktır. Drv nesnemiz Tureyen sınıf nesnesi olduğundan ve Temel sınıftan kalıtımsal olarak türetildiğinden baseOb isimli nesnemize aktarılabilmiştir. Şu durumda baseOb isimli Temel sınıf nesnemiz drv isimli Tureyen sınıf nesnemizi taşımaktadır. Bu tip bir atamam böyle base-derived ilişkide sınıflar için geçerli bir atamadır. Sorun baseOb isimli nesne için Yazdir metodunun çağırılmasındadır. Biz burada Tureyen sınıf nesnesini aktardığımız için bu sınıfa ait Who metodunun çalıştırılmasını bekleriz. Oysaki sonuç aşağıdaki gibi olucaktır.
/// Saygılarımla Orhan Türk Bu Anlatımda Sizlere Virtual Method Ne Amaçla Kullanırız Onu Sunmuş Oldum Makkalemde Gecen Bazı Örnekler Alıntı
class Program
{
static void Main(string[] args)
{
Base baseOb = new Base();
Derived1 dOb1 = new Derived1();
Base baseRef = baseOb;
baseRef.who();
baseRef = dOb1;
baseRef.who();
dOb1.who();
//Derived2 dOb2 = new Derived2();
//baseRef = dOb2;
//baseRef.who();
Console.ReadLine();
}
}
}