5

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

www.mshowto.org

Bu İçeriğe Tepkin Ne Oldu?
  • 30
    harika_
    Harika!!
  • 13
    be_enmedim
    Beğenmedim
  • 1
    _ok_iyi
    Çok iyi
  • 5
    sevdim_
    Sevdim!
  • 4
    bilemedim_
    Bilemedim!
  • 4
    olmad_
    Olmadı!
  • 1
    k_zd_m_
    Kızdım!

1986 Aksaray Doğumluyum, Yıldız Teknik Üniversitesi Matematik bölümünden 2010 yılında mezun oldum ve yaklaşık 4 senedir IT sektöründe Yazılım ve Sistem uzmanı olarak çalışmaktayım. Bu süre içerisinde birçok Windows ve Web uygulamaları geliştirmiş olup, SQL Server konusunda oldukça tecrübeliyim. MCP, MCTC, MCPD, MCITP, MCSA ve CCNA sahip olduğum sertifikalardır.

Yazarın Profili
İlginizi Çekebilir

Bültenimize Katılın

Tıklayın, üyemiz olun ve yeni güncellemelerden haberdar olan ilk kişi siz olun.

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Yorumlar (5)

  1. Çok teşekkürler.Anlatımınız çok güzel ve sade.

  2. Keşke code editor vs. kullansaydınız.

    • 26/07/2019

      Yazıyı tekrar düzenleyeceğiz. 1-2 gün sonra tekrar kontrol edebilirsiniz. Geri bildiriminiz için teşekkürler.

  3. Overright degil de override olacakti

  4. 13/03/2020

    Teşekkürler çok yararlı.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir