Bu makalemde C# da, Virtual metodlardan bahsedeceğim. Virtual, metodlara uygulanan anahtar bir sözcüktür. Ve Virtual olarak tanımladığımız metodlarımızı, diğer class larda override edebiliriz.
Yani, kalıtıldığı(miras alındığı) sınıfta metodun gövdesini ( süslü parantezlerin içi) değiştirebileceğimiz anlamına gelir.
Virtual metodları aslında bir çok yerde kullanabiliriz, ama genel olarak kullanım şekilleri aşağıdaki gibidir.
- Sadece metod isimlerini belirteceğimiz bir classımız olsun, metodların ne işlev yapacağını diğer classlarda belirtecek isek Virtual metod kullanırız.
- Birden çok Class larımızın, aynı anlama gelen metodları varsa, bu metodu Virtual olarak tanımlarız.
- Yazılımda standartlaşmak önemlidir, eğer geliştirilen uygulamamızın farklı modüllerinde, metod isimlerimizin aynı olması isteniyorsa, yine Virtual metod kullanırız.
Her Abstract metod aslında Virtual dır, fakat Abstract metodlar ile Virtual metodların arasında önemli farklılıklar vardır. Abstrac konusunu merak eden arkadaşlar varsa Abstract Classlar adlı makalemi inceleyebilirler.
Şimdi, Virtual metodlarımız ile ilgili giriş anlamında bir örnek yapalım.
3 Adet Class ımız olsun, A, B ve C adlarıyla.
class A { public virtual void ClassName() { Console.WriteLine("A: Class"); } } class B : A { public override void ClassName() { Console.WriteLine("B: Class"); } } class C : A { public override void ClassName() { Console.WriteLine("C: Class"); } }
Görüldüğü gibi, 3 adet clasımız var,
A Clasında ClassName adında bir Virtual metod tanımlanmış, B ve C class ımızda A dan miras alarak ClassName metodunu overright etmiştir.
İşlemimize devam edelim;
A Class1 = new B(); Class1.ClassName();
Aldığımız sonuç :
Resim-1
Bir de aşağıdaki gibi deneyelim.
A Class1 = new C(); Class1.ClassName();
Aldığımız sonuç :
Resim-2
Görüdlüğü gibi, A clasımızda bir Virtual metod tanımladık ve B,C classlarımızda da bu metodun gövdesini değiştirerek kullanabildiğimizi gösterdik.
Ayrıca,
A Class1 = new C();
Gibi ifadelerde, C, A dan türetildiği için A nın üzerindedir. Bu yüzden bu tür durumlarda eşitlik daima Sağ taraftakine göre olacaktır.
Şimdi, gelelim asıl örneğimize.
Bu örneğimizde Virtual metodlarımızı neden kullandığımızı daha iyi anlayacağız.
Ufak bir uygulama yapacağız ve uygulamamızda Diktörtgen, Kare ve Çember gibi şekillerimizin Alan, Çevre uzunluğunu hesaplayacağız. (Matematik bölümü mezunu olduğum için bu tür uygulamalara yatkınımdır :) )
Hemen Class larımızı aşağıda belirtelim.
class Hesaplamalar { public virtual void AlanHesapla(double deger1, double deger2) { //Alan hesaplanacaktır } public virtual void CevreHesapla(double deger1, double deger2) { //Çevre uzunluğu hesaplanacaktır } } class Dikdortgen : Hesaplamalar { public override void AlanHesapla(double KisaKenar, double UzunKenar) { double Alan = KisaKenar * UzunKenar; Console.WriteLine("Dikdörtgen Alanı:" +Alan); } public override void CevreHesapla(double KisaKenar, double UzunKenar) { double Cevre = 2 * (KisaKenar + UzunKenar); Console.WriteLine("Dikdörtgenin Çevresi:" +Cevre); } } class Kare : Hesaplamalar { public override void AlanHesapla(double KenarUzunlugu, double deger2) { Double Alan = (KenarUzunlugu * KenarUzunlugu); Console.WriteLine("Karenin Alanı:" +Alan); } public override void CevreHesapla(double KenarUzunlugu, double deger2) { Double Cevre = 4 * KenarUzunlugu; Console.WriteLine("Karenin Çevresi:" +Cevre); } } class Cember : Hesaplamalar { public override void AlanHesapla(double YariCap, double Pi) { double Alan = Pi * YariCap * YariCap; Console.WriteLine("Çemberin Alanı:" +Alan); } public override void CevreHesapla(double YariCap, double Pi) { double Cevre = 2 * Pi * YariCap; Console.WriteLine("Çemberin Çevresi:" +Cevre); } }
Evet Class larımızı oluşturmuş olduk.
Hesaplamalar adında bir class oluşturduk ve içerisine AlanHesapla ve CevreHesapla adında 2 adet Virtual metod tanımladık.
Ardından:
Dikdortgen, Kare ve Cember adında 3 adet class tanımladık ve Hesaplamalar classındantirettik.
Daha sonra her bir classımız için Alan ve Çevre hespalamalarını yukarda gördüğünüz gibi hesapladık :)
Şimdi gelelim sonuçlarımıza:
Kodlamamızı aşağıdaki gibi yapalım:
Hesaplamalar DikdortgenHesapla = new Dikdortgen();
DikdortgenHesapla.AlanHesapla(5,4); DikdortgenHesapla.CevreHesapla(5,4); Console.WriteLine(); Hesaplamalar KareHesapla = new Kare(); KareHesapla.AlanHesapla(5, 5); KareHesapla.CevreHesapla(5, 5); Console.WriteLine(); Hesaplamalar CemberHesapla = new Cember(); CemberHesapla.AlanHesapla(5, Math.PI); CemberHesapla.CevreHesapla(5, Math.PI);
Ve aldığımız sonuç aşağıdaki gibidir.
Resim-3
Görüldüğü gibi, Aynı metod, farklı classlar içerisinde farkı işlevler yapabilmektedir.
AlanHesapla ve CevreHesapla metodlarımız, 3 farklı metod içerisinde, farklı hesaplamalar yapmıştır.
Bu işlevi yapmamızı sağlayan Virtual metodlarımızdır.
Bu makalemde Virtual metodlarından bahsetmeye çalıştım. Umarım verdiğim örnekler faydalı olmuştur.
Yukardaki örnekleri içeren uygulamayı Buradan indirebilirsiniz.
Bu konuyla ilgili sorularınızı alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.
Referanslar