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.

Harika bir anlatımın var..Çok işime yaradı,çok teşekkür ederim.
Asıl ben teşekkür ederim…Faydasını gördüyseniz ne mutlu bana 🙂
Videonu izledim youtubedan ve buraya geldim. Çok güzel bir anlatımın var. Hep başarılı ol inşaallah böyle:)
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…
Eline emeğine aklına sağlık tüm yazılarını kronolojik olarak okumaya çalışıyorum okudukça okuyasım geliyor sakın kapatma bu siteyi 🙂
Bol bol faydalanmanız dileğiyle…
Sevgiler.
Abi harikasın.Çok iyi anlatmışsın.Ellerine sağlık teşekkürler.
Merhaba Tuna,
Bende sana güzel geri dönüşün için teşekkür ederim…
cok güzell anlatım cok başarılı biligilerden dolayı tsekrler..
Faydalandıysanız ne mutlu… 🙂
COK HARİKAA
Şaka yoluyla cinsiyetçilik yapmanıza kızdım.
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…
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.
Hadi ordan 🙂 Böyle öğrenci mi olur yhau?
Kesinlikle ideal öğrenciyim itiraf edebilirsiniz . Güldünüz yakaladım 😀 Plak var hocam mouse isterseniz eğer 😀 güzel yarınlar güzel insanlar sizlere selam olsun. Hadi Allaha emanet…
Kesinlikle ideal öğrenciysen vay halimize 🙂 Sanada selam olsun. Allahaısmarladık…
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?
Merhaba,
Kalıtımsal olarak aktarılacağı için kullanabilirsin.
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
Merhaba,
Öyle bir durumda ilgili listeyi farklı bir static class‘ta tutabilir ve ilgili sınıflarda çağırabilirsin.
İyi çalışmalar.