Site icon Serdar Yılmaz

C# – Virtual Metotlar

Kalıtım yolu ile sınıfların birbirinden 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# – 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 içerisinde yeniden tanımlayabilmek için virtual ve override anahtar sözcüklerini kullanırız.

Virtual metotlar kalıtım yolu ile aktarıldıkları sınıfların içerisinde override edilerek değiştirilebilirler. Eğer override edilmezlerse temel sınıf içerisinde tanımlandıkları şekilde çalışırlar.

Kod kalabalığını 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 senaryo ü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("Serdar_Yilmaz");

        Category category = new Category();
        category.Insert("Programlama");

        Article article = new Article();
        article.Insert("C# - Virtual Metotlar");
    }
}

Yukarıdaki konsol uygulamasının ekran çıktısı;

Serdar_Yilmaz Kaydedildi.
Programlama Kaydedildi.
C# - Virtual Metotlar 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 bir 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=="Serdar_Yilmaz")
        {
            Console.WriteLine("{0} Zaten Kayıtlı.", data);
        }
        else
        {
            base.Insert(data);
        }
    }
}

public class Category : Database
{

}

public class Article : Database
{

}

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 orijinalini (temel sınıf içerisindeki halini) çağırabilmek için base anahtar sözcüğü kullanılır.

class Program
{
    static void Main(string[] args)
    {
        User user = new User();
        user.Insert("Serdar_Yilmaz");

        Category category = new Category();
        category.Insert("Programlama");

        Article article = new Article();
        article.Insert("C# - Virtual Metotlar");
    }
}

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

Serdar_Yilmaz Zaten Kayıtlı.
Programlama Kaydedildi.
C# - Virtual Metotlar Kaydedildi.
Press any key to continue . . .

Serdar YILMAZ

Exit mobile version