Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

C# Inheritance(Kalıtım,Miras)

Önceki sayfalar da kalıtım konusuna giriş kıvamındaydı.Bu sayfada ise kalıtımın sistematik mantığını inceleyeceğiz.Şimdi bir emlakçı mantığıyla çalışan kiralık ve satılık evlerin kalıtımsal hiyerarşisini kuralım. Kiralık ve satılık evlerin ortak özelliklerini Ev.cs sınıfın da hazırlayalım.  

---Ev.cs---
    class Ev
    {
        public int OdaSayisi { get; set; }
        public double Alani { get; set; }
        public double Fiyati { get; set; }
        public int Kati { get; set; }
        public bool GarajVarmi { get; set; }
    }

Aklıma geldiği kadar bir evin olağan özelliklerini yazdım.Şimdi kiralık evin classını oluşturalım.Kiralik.cs sınıfında hazırlayalım.

---Kiralik.cs---
    class Kiralik:Ev
    {
        public int KontratSuresi { get; set; }
    }

Şimdi de satılık evlerin classını oluşturalım.Satilik.cs sınıfında hazırlayalım.

---Satilik.cs---
    class Satilik:Ev
    {
        public int EmlakciKomisyonu { get; set; }
    }

Şimdi bu oluşturduğumuz ufak hiyerarşiyi oluşturmamın sebebi , kalıtımın işleyiş mantığını anlatmak için oluşturdum.
Şimdi Satilik.cs ya da Kiralik.cs’den nesne oluşturalım.

Kiralik kiralikev = new Kiralik();

Yukarıda bir adet Kiralik.cs sınıfından nesne yarattık.Aslında bu nesne yaratılmadan önce Base Class arka planda bir Ev nesnesi yaratır, içindeki propertyler set edilir,işlemleri yapılır daha sonra Kiralik.cs sınıfından nesne oluşturulur ve işlemleri yapılır.
Yani anlayacağınız bir sınıfın Base Classının constructorı her zaman Derived Classın constructorından önce çalışır.
Şimdi çalışma mantığı budur.Bu mantıkla haraket edersek olası bir kaç durum vardır onları sizlere açıklamak istiyorum.


Şimdi Ev.cs sınıfının constructorını değiştirelim.

---Ev.cs---
    class Ev
    {
        public int OdaSayisi { get; set; }
        public double Alani { get; set; }
        public double Fiyati { get; set; }
        public int Kati { get; set; }
        public bool GarajVarmi { get; set; }
        public Ev(string rastgeleparametrealsin) { }
    }

Yukarıda gördüğünüz gibi Ev.cs sınıfının constructorını parametreli olarak değiştirdim.Şimdi bu durumda Kiralik.cs ya da Satilik.cs den bir nesne oluşturalım.(Kiralik.cs ve Satilik.cs sınıfları değiştirilmediği için yukarıdakilerin aynısıdır.)

Kiralik kiralikev = new Kiralik();

Bu nesneyi oluşturduktan sonra programımızı derlersek eğer hatayla karşılaşacağız.Program derlenmeyecektir.Aslında yazının bu satırına kadar okuduysanız sebebini biraz düşünüp bulabilirsiniz.
Bu hatanın sebebi,yukarılarda bahsettiğim gibi,Kiralik.cs sınıfından nesne oluşturulmadan önce,Base Class tan nesne oluşturulur.Ancak program akışı Base Class’a gelince parametreli constructordan başka bişey bulamayacaktır.Biliyoruz ki bir classa parametreli constructor yazınca ve boş constructor yazmayınca, mecbur o sınıftan nesne üretilirken o constructorın parametrelerine değerler gönderilmelidir.Çünkü boş constructor olmadığı için,mecbur o constructorı kullanmak zorunda kalıyoruz.
Bu sebepten dolayı Kiralik.cs den nesne oluşturulmadan önce Base Classında boş constructor ile nesne oluşturmaya çalışıyor.Ev.cs sınıfında boş constructor olmadığından ya da Kiralik.cs sınıfının boş constructorından Ev.cs içindeki başka bir constructor referans edilmediğinden dolayı hata oluşuyor.
Bu sorunun çözümü Ev.cs sınıfı içinde Kiralik.cs sınıfı ile uyumlu constructor yazmak gerekiyor.(Örnekteki çözüm Ev.cs sınıfına bir tane boş contructor yazmak yeterli olacaktır.)
Şimdi ise varsayalım ki , Ev.cs sınıfı içine Kiralik.cs ile uyumlu constructor yazmadık.Ancak Kiralik.cs sınıfından nesne oluştururken Base Classtaki parametreli constructorı kullanmayı görelim.
Kiralik.cs sınıfını şu şekilde düzenleyeceğiz.

---Kiralik.cs---
    class Kiralik:Ev
    {
        public int KontratSuresi { get; set; }
        public Kiralik(): base("RastgeleDeğer")
        { }
    }

Yukarıda gördüğünüz gibi,Kiralik.cs ye bir constructor yazdım ve “:” operatörünü kullanarak “base” tagıyla Base Classtaki constructora değer gönderdim.base tagı,Base Classtaki constructorlara ulaşmamızı sağlıyor.(Örnek verdiğim projede Satilik.cs sınıfıda Ev.cs sınıfından kalıtım aldığı için aynı işlemleri ona uyguluyorum.)
Bu olası hataya düşerseniz şimdiden önlemini almak için bahsettim.
Şimdi bir sonraki sayfada virtual ve override kavramlarından bahsedeceğim.

Bunlar da hoşunuza gidebilir...

22 Cevaplar

  1. Ahmet dedi ki:

    Harika bir anlatımın var..Çok işime yaradı,çok teşekkür ederim.

  2. Gencay dedi ki:

    Asıl ben teşekkür ederim…Faydasını gördüyseniz ne mutlu bana 🙂

  3. ensar bağış dedi ki:

    Videonu izledim youtubedan ve buraya geldim. Çok güzel bir anlatımın var. Hep başarılı ol inşaallah böyle:)

    • Gençay dedi ki:

      Merhaba Ensar,
      Güzel yorumun ve iltifatın için teşekkür ederim.
      Allah hepimizde başarıyı nasip etsin…
      Güzel insansın, beni çok mutlu ettin…Allah’ta seni mutlu etsin…

  4. Tuna dedi ki:

    Abi harikasın.Çok iyi anlatmışsın.Ellerine sağlık teşekkürler.

  5. emrecan dedi ki:

    cok güzell anlatım cok başarılı biligilerden dolayı tsekrler..

  6. emrecan dedi ki:

    COK HARİKAA

  7. şule dedi ki:

    Şaka yoluyla cinsiyetçilik yapmanıza kızdım.

    • Gençay dedi ki:

      Bu kadar duyar kasarsanız muhabbetleri nesneler dünyasına sınırlandırırsınız.
      Cinsiyetçilik maksatlı bir içerik oluşturmadığımı sizlerde biliyorsunuz.

      Sevgiler…

  8. Tuğbaaaa dedi ki:

    Hocam hiç açıklayıcı olmamış.Ayrıca da cinsiyetçilik yapmışsınız hiç yakıştıramadım. Kendinize iyi mi baksanız bilemedim. Uhuf diyorum yalnızca. Muhabbetlerinizin nesneler dünyasında sınırlı kalmaması dileğiyle.

  9. Talat dedi ki:

    Merhaba hocam, kucuk bir sorum olacak entityleri olustururken bir classtan baska bir class’a miras verirsek base class’ in propertylerini bir alt class’ta kullanabilirmiyiz?

  10. cihan dedi ki:

    Merhaba elinize sağlık. Benim de bir sorum olacak. Base classta 100bin kayıttan oluşan bir object List oluşrutmak istiyorum Ve classtan türeyen classların bu listeye ulaşmasını istiyorum. Ancak anladığım kadarıyla türeyen her class için bu liste kopyalanacak bunu nasıl engelleyebiliriz. Teşekkürler

    • Gençay dedi ki:

      Merhaba,

      Öyle bir durumda ilgili listeyi farklı bir static class‘ta tutabilir ve ilgili sınıflarda çağırabilirsin.

      İyi çalışmalar.

  1. 19 Mart 2018

    […] erişim belirleyicileri hakkında C# Inheritance(Kalıtım,Miras) başlıklı yazımızda detaylı bir değerlendirmede bulunmuştuk. Bu erişim belirleyicilerinin […]

Bir yanıt yazın

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