C# Virtual Method Nedir?

Kalıtım yoluyla sınıfların türetilebileceğini ve bir sınıfın diğer bir sınıftan türediği zaman, türediği sınıfın bütün özelliklerini içereceğini C# Inheritance (Kalıtım) başlıklı içeriğimizde açıklamıştık.

Temel sınıftan türetilmiş sınıflara aktarılan metotları her zaman olduğu gibi kullanmak istemeyebiliriz. Bu metotları türetilmiş sınıfın içerisinden yeniden tanımlayabilmek için virtual ve override anahtar sözcüklerini kullanırız.

Virtual metotlar Inheritance (Kalıtım) yoluyla aktarıldıkları sınıfların içerisinden override edilerek değiştirilebilirler. Eğer override edilmezlerse temel sınıf içerisinde tanımladıkları şekilde çalışırlar.

Kod kalabalığı arttırmamak ve konuyu daha anlaşılır bir şekilde anlatmak için; sınıfları karışıklığa yer vermeyecek şekilde isimlendirip, konumuzun dışında olan kod satırlarına/bloklarına yer vermemeye çalışacağım.

Örnek bir seneryo üzerinden gidecek olursak; User (kullanıcı), Category (kategori) ve Article (Makale) isimli sınıflarımızın olduğunu ve bu sınıfların Database sınıfından türetildiğini düşünelim

    public class Database
    {
        public void Insert(string data)
        {
            Console.WriteLine("{0} Kaydedildi.", data);
        }
    }
    public class User : Database
    { 
    
    }
    public class Category : Database 
    { 
    
    }
    public class Article : Database 
    { 

    }

Database sınıfı içerisindeki Insert() metodu kalıtım yolu ile User, Category ve Article sınıflarına aktarılacaktır.

    class Program
    {
        static void Main(string[] args)
        {

            User user = new User();
            user.Insert("Fatih Alkan");
            Category category = new Category();
            category.Insert(".Net Eğitim");
            Article article = new Article();
            article.Insert("C# Virtual Method");
        }
    }

Ekran Çıktısı

Fatih Alkan Kaydedildi.
.Net Eğitim Kaydedildi.
C# Virtual Method Kaydedildi
Press any key to continue...

Ancak biz User sınıfında Insert() metodunun kullanıcı adı kontrolü yaptıktan sonra veriyi kaydetmesini istiyor olabiliriz. Temel sınıf içerisindeki bu metodun gövdesini türetilmiş sınıflar içerisinde değiştirebilmek için Temel sınıf içerisindeki metodu “virtual” olarak tanımlamamız gerekir.

    public class Database
    {
        public virtual void Insert(string data)
        {
            Console.WriteLine("{0} Kaydedildi.", data);
        }
    }
    public class User : Database
    {
        public override void Insert(string data)
        {
            if (data == "Fatih Alkan")
            {
                Console.WriteLine("{0} Zaten Kayıtlı", data);
            }
            else
            {
                base.Insert(data);
            }
        }
    }

Database sınıfı içerisindeki Insert() metodu virtual olarak belirtildiği için User sınıfı içerisinde override edilerek gövdesi değiştirildi. Override edilmiş bir metot içerisinden metodun orjinalini (temel sınıf içerisindeki halini) çağırabilmek için base anahtar sözcüğü kullanılır.

Şimdi konsol uygulamamızı tekrar çalıştıracak olursak ekran çıktısı aşağıdaki gibi olacaktır.

Fatih Alkan Zaten Kayıtlı.
.Net Eğitim Kaydedildi.
C# Virtual Method Kaydedildi
Press any key to continue...