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
Microsoft’un virtual keyword’ünü okuduktan sonra bu sayfayı da okudum. base kullanımını gördüm faydalı oldu benim için. Çok teşekkürler
harika ve sade bir anlatım çok teşekkürler…
Engin demiroğ hocamızın verdiği ödevlerden biriydi. Çok teşekkür ederim çok net bir şekilde ve güzel örneklerle anlatmışsınız. Elinize emeğinize sağlık.
Udemy de 30 dakikada anlatılan videoyu anlamayıp buraya geldim. 2 dakikada anlattıklarınızı anladım. Emeğinize sağlık. Bu kadar basit ve anlaşılır anlattığınız için teşekkür ederim. Bu site vazgeçilmezim oldu.
Teşekkürler Serdar Bey. Çok yalın ve akıcı makaleleriniz var.
Teşekkürler Kürşat bey, beğenmenize sevindim.
teşekkürler Serdar bey
hani base ?
Base anahtar sözcüğünün kullanımı hakkında bilgi edinmek için “C# – Yapıcı Metotlar ve Kalıtım” isimli içeriği okuyabilirsiniz.