C# : Kalıtım 2 – new Anahtar Kelimesi & Sanal Metotlar

c sharp 150x150 C# : Kalıtım 2   new Anahtar Kelimesi & Sanal Metotlar dot net c sharp Merhaba arkadaşlar, bu aralar okul iş sınavlar derken aksatıyorum burayı icon smile C# : Kalıtım 2   new Anahtar Kelimesi & Sanal Metotlar dot net c sharp C# : Kalıtım yazımızda C# da Kalıtıma giriş yapmıştık. Bugün ise kalıtım da new (name hiding/isim saklama), virtual, override(sanal metodlar) anahtar kelimeleri nedir, nerede ne işe yarar onu anlatacağım inş.

Biz şimdiye kadar new anahtar kelimesini sadece sınıf kurarken kullanmıştık.

Öncelikle aşağıda hazırladığım programı irdeleyin, burada göreceğiniz şekilde Ev ve KiralikEv sınıfında aynı evGoster metodu tanımlanmış ;

using System;

namespace Kalıtım
{
    class Ev
    {
        private string adres;

        public string Adres
        {
            get { return adres; }
            set { adres = value; }
        }
        private int alan;

        public int Alan
        {
            get { return alan; }
            set { alan = value; }
        }

        public Ev(string adres, int alan)
        {
            this.adres = adres;
            this.alan = alan;
        }

        public void evGoster()
        {
            Console.WriteLine("t** Ev sınıfı **nAdres : {0}nAlan: {1}", adres, alan);
        }

    }

    class KiralikEv : Ev
    {
        public int kira;

        public KiralikEv(int kira, string adres, int alan)
            : base(adres, alan)
        {
            this.kira = kira;
        }

        public void evGoster()
        {
            Console.WriteLine("t** KiralikEv sınıfı **nAdres : {0}nAlan: {1}nKira : {2}", Adres, Alan, kira);
        }

    }

    class Program
    {
        static void Main()
        {
            Ev ev = new Ev("Adresimiz", 250);
            ev.evGoster();

            KiralikEv kira = new KiralikEv(123, "Adresimiz",150);
            kira.evGoster();

            Console.Read();
        }
    }
}

Derleme esnasında program bize bir uyarı veriyor, uyarı diyorum çünkü derleme esnasında herhangi yanlış birşey yok.

‘Kalıtım.KiralikEv.evGoster()’ üyesi ‘Kalıtım.Ev.evGoster()’ üyesini eziyor diyor ve bilinçli yaptığımızdan emin olmak için new anahtar kelimesini kullanmamızı öneriyor.

Programımız çalıştı ve çıktısına bakalım;

** Ev sınıfı **
Adres : Adresimiz
Alan: 250
** KiralikEv sınıfı **
Adres : Adresimiz
Alan: 150
Kira : 123

Ev sınıfından oluşturduğumuz ev referansı ile metodumuzu çağırdığımızda Ev sınıfındaki evGoster metodu, KiralikEv sınıfından oluşturduğumuz referans ile metodumuzu çağırdığımızda ise KiralikEv sınıfındaki evGoster metodu çağırıldı. İşte bu işleme İsim Saklama (name hiding) denir.

Bu nasıl oluyor ?
Biz aynı şekilde değişkenleri de türeyen sınıflarda aynı isimde kullanabiliriz. Bunu yaparak miras alınan sınıftaki değeri kenara atıyoruz. Yukarıdaki kodlarla bir yanlışlık/eksiklik yok ancak okunurluk açısından new anahtar kelimesini isim saklama işlemini yaptığımız yerde kullanmak daha doğrudur.

Tüm kodları verip göz yormak istemiyorum bu yüzden sadece KiralikEv sınıfındaki metodun olması gerektiği şekilde veriyorum(tek fark metodu oluştururken başına new eklemek);

        new public void evGoster()
        {
            Console.WriteLine("t** KiralikEv sınıfı **nAdres : {0}nAlan: {1}nKira : {2}", Adres, Alan, kira);
        }

Aynı şekilde değişkenleride kullanabiliriz, bu durumda yine new anahtar kelimesini kullanmanız gerekiyor.

Bununla sınırlı değil, her nesne object türünden türemiştir değil mi ? Evet türemiştir. Ee haliyle arkaplanda base sınıfı object olmuyor mu ? Evet oluyor, o zaman aşağıdaki örneğe bakın :

class Ev
{
        new public string ToString()
        {
           return "Gördüğünüz gibi bu sefer object sınıfındaki ToString metodunu new anahtar kelimesi ile ezdik";
        }
}
    class Program
    {
            Ev ev= new Ev();
            Console.WriteLine(ev.ToString());

            Console.Read();
        }

Neden mi ? Çünkü C# da her nesnenin özünde object yatar, yani her sınıf Object sınıfından miras olmuştur, tabi bu OOP’nin kuralıdır. E durum böyle olunca bizde, name hiding işlemini gerçekleştirebiliyoruz.


Sanal Metotlar

Sanal Metotlar ise base (temel sınıfta) sınıfda oluşturduğumuz bir metodu, bu sınıftan miras alan sınıflarda istediğimiz gibi değiştirmektir. Yani biz Ev sınıfında türettiğimiz bir metodu, KiralikEv sınıfında aynı isimde farklı bir görevde kullanabiliriz. İşte burada virtual(sanal) ve override(öncekini pasif etmek) anahtar kelimeleri görevi üstleniyor. Sanal metotların en önemli özelliği geç bağlam (late binding) özelliğini desteklemesidir.

Kullanımını yine kafa karıştırmamak için Ev sınıfı üzerinde göstermek istiyorum.

using System;
using System.Collections.Generic;
using System.Text;

namespace KalıtımBlog2
{

    class Ev
    {
        public int alan;
        public string adres;

        public Ev(string adres, int alan)
        {
            this.alan = alan;
            this.adres = adres;
        }

        virtual public void EvGoster()
        {
            Console.WriteLine("Alan : {0}nAdres: {1}nn", this.alan, this.adres);
        }
    }

    class KiralikEv : Ev
    {
        int kira;

        public KiralikEv(int alan, string adres, int kira)
            : base(adres, alan)
        {
            this.kira = kira;

        }

        // burada override anahtar kelimesini hemen yazdıktan sonra override edebileceğiniz metodlar gösterilmekte
        // default olarak kurduğu metod içerisinde base.evGoster() i yani Ev sınıfındaki metodu çağırıyor.
        public override void EvGoster()
        {
            Console.WriteLine("Alan : {0}nAdres: {1}nKira: {2}nn", this.alan, this.adres, this.kira);
        }

    }

    class SatilikEv : Ev
    {
        int fiat;

        public SatilikEv(int alan, string adres, int fiat)
            : base(adres, alan)
        {
            this.fiat = fiat;

        }

        public override void EvGoster()
        {
            Console.WriteLine("Alan : {0}nAdres: {1}nFiat: {2}nn", this.alan, this.adres, this.fiat);
        }

    }

    class Program
    {
        static void Main(string[] args)
        {
            Ev ev = new Ev("adresimiz - base", 120);
            ev.EvGoster();

            KiralikEv kira = new KiralikEv(121, "adresimiz - kiralik", 200);
            kira.EvGoster();

            SatilikEv satilik = new SatilikEv(122, "adresimiz - satilik", 20000);
            satilik.EvGoster();

            // Buraya kadar anlaşılmayan birşey yoktur umarım.
            // Şimdi aşağıdaki kodu inceleyelim.
            ev = kira;
            ev.EvGoster();

            // Buradaki ev referans kira referansına eşitlenmiştir, bu eşitlemeden sonra Ev sınıfınındaki metodu çağırdığımızda, KiralikEv sınıfında override edilmiş metod çağırılmaktadır.
            Console.Read();
        }
    }
}

Gerekli açıklamaları kod tarafında yaptım, çıktı aşağıdaki şekilde olmalıdır.

Alan : 120
Adres: adresimiz – base

Alan : 121
Adres: adresimiz – kiralik
Kira: 200

Alan : 122
Adres: adresimiz – satilik
Fiat: 20000

Alan : 121
Adres: adresimiz – kiralik
Kira: 200

Kafanıza takılan birşey olursa sorunuz icon smile C# : Kalıtım 2   new Anahtar Kelimesi & Sanal Metotlar dot net c sharp

Tags: , , , , , ,

2 Comments

  1. Sayın hocam ben yeni başladım programcılığa ve yazınıza rağmen isim saklama ve sanal metot kullanma arasındaki farkı anlamadım(gec baglama tamamda sınıf ıcınde kullanım farkını soruyorum)…
    Cevapladığınız için şimdiden teşekkür ederim….

  2. Paylaşımlarınız için teşekkürler.Başarılar…

Yorum yaz

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Ads