C# - Kalıtım (Inheritance)
C# Nesne Yönelimli bir Programlama (OOP yada Object Oriented Programming) dilidir. Bu yapının en önemli yönlerinden biri kuşkusuz "inheritance" (miras alma yada kalıtım) konusudur. Kısaca buna class ların bazı üyelerini başka classlardan devralmaları diyebiliriz. Tüm .NET framework ü bu yapı üzerine inşaa edilmiştir.
Nesne yönelimli programlamada herşey bir nesnedir. Herşey "System.Object" class ından türer yani o sınıftan kalıtım sağlanır.
Aşağıdaki kodu inceleyelim..
using System;
namespace MirasOrnek
{
class Program
{
static void Main(string[] args)
{
Kedi kedicik = new Kedi();
kedicik.ad = "Şerafettin";
kedicik.boy = 35;
kedicik.kuyrukVarmi = true;
Console.WriteLine( "Merhaba benim adım : " + kedicik.ad + " \nBoyum : " + kedicik.boy + "\nMesajim : "
+ kedicik.Mesaj());
Console.ReadKey();
}
}
public class Hayvan
{
public string ad { get; set; }
public decimal boy { get; set; }
public bool kuyrukVarmi { get; set; }
public string Mesaj()
{
return "Hayvanları sevelim...beni evde besleyebilirsiniz.";
}
}
public class Kedi : Hayvan
{
}
}
Burada "Hayvan" ve "Kedi" isminde iki class tanımladık. Fakat dikkat ederseniz "Kedi" class ının hiçbir üyesi yok, yani kod bloğu boş. Bu class ın hiçbir üyesinin olmaması onun işlevsiz olduğu anlamına gelmemektedir. "Kedi : Hayvan" ifadesi ile "Kedi" class ının "Hayvan" class ındaki üyeleri miras aldığı (inherit), yani artık onun üyelerini kendi üyeleri yaptığı anlamına gelmektedir.
"static void Main" içinde bir "Kedi" nesnesi tanımlıyoruz ve "Hayvan" clas ının tüm üyelerini bu nesnede (kedicik) kullanabiliyoruz. Çünkü "Kedi" class ı "Hayvan" class ından miras almıştır.
Fakat burada kafanızda bazı sorular belirmiş olabilir. Bunlardan en önemlisi de "Ya ben Hayvan class ının tüm üyelerini olduğu gibi kullanmak istemessem ne olacak ?". Mesela "Hayvan" class ının "Mesaj()" fonksiyonu bir string döndürmekte. Fakat bu sınıftan türeyen tüm class lar için bu mesajı vermek istemeyebilirsiniz.
Aşağıdaki kodu inceleyelim..
public class Hayvan
{
public string ad { get; set; }
public decimal boy { get; set; }
public bool kuyrukVarmi { get; set; }
public virtual string Mesaj()
{
return "Hayvanları sevelim...beni evde besleyebilirsiniz.";
}
}
public class Kedi : Hayvan
{
}
public class Balina : Hayvan
{
public override string Mesaj()
{
return "Hayvanları sevelim...beni evde besleyebilir misin...Orasından emin değilim.";
}
}
Burada 2 önemli değişiklik yaptık ilki "Hayvan" class ımızdaki "Mesaj()" fonksiyonumuza "virtual" keyword ü (anahtar sözcüğü) ekledik. Bunun anlamı bu üyeyi miras verdiğin class içinde istersen değiştirebilirsin demektir. İkinci değişikliğimiz ise yeni yarattığımız "Balina" class ında "Mesaj()" fonksiyonu yaratmamızdır. Dikkat ederseniz bu fonksinda "override" keyword ü var. Bunun anlamı "Ben senden (Hayvan class ından) Mesaj() fonksiyonunu alıyorum ama onu ezip kendi istediğim şekilde kullanıcam" demektir. Görüldüğü üzere "Balina" class ı "Hayvan" class ından tüm üyeleri almış ama "Mesaj()" fonksiyonunu kendine göre değiştirmiştir.
Aşğıdaki kodu çalıştırısanız farkı görebilirsiniz..
static void Main(string[] args)
{
Kedi kedicik = new Kedi();
Balina balinacik = new Balina();
Console.WriteLine(kedicik.Mesaj());
Console.WriteLine(balinacik.Mesaj());
Console.ReadKey();
}
"Inheritance" (kalıtım/miras) sadece bir class tan diğerine değil, birbirlerine miras verebilir bir durumda da olabilir. Şuana kadarki örnekte "Hayvan" -> "Kedi / Balina" classları arasında bir miras verilmesi söz konusuydu. Bunu daha da geliştirip "Canli" -> "Hayvan" -> "Kedigiller" -> "Leopar" şeklinde bir miras hiyerarşisi şeklinde de yapabiliriz.
Önemli bir noktayı belirtelim. C#'da bir class sadece başka bir adet class tan miras alabilir. Aynı anda birkaç class tan miras alamaz. Yani "Kedi : Hayvan" ifadesi kodda hata vermez ama "Kedi : Kedigiller,Hayvan" şeklinde bir yöntem uygulayamazsınız.
Proje geliştikçe bir class ın birden fazla class tan miras alma ihtiyacı kaçınılmaz olacaktır. Yukarıda değindiğimiz gibi C# buna izin vermez. Bunu farklı bir yolla yapabilmek için Interface (Arayüz) kullanmanız gerekecektir. "Interface" dersinde bu konu anlatılmaktadır.