Kalıtım (Inheritance) Nedir? Kod Tekrarından Nasıl Kurtuluruz? (1/4)

Nesne Yönelimli Programlamanın Dört İlkesini gösteren arkaplan

Nesne Yönelimli Programlamanın en kullanışlı ve kod tekrarını azaltan özelliklerinden biri de kalıtımdır.

Kalıtım/Tevarüs (Inheritance); bir sınıfı başka bir sınıftan türetmeye ve onun tüm özelliklerini tevarüs etmeye denir. Kalıtımı kullanma amacımız kod tekrarını azaltmak ve kodu daha sade ve okunabilir kılmaktır.

Mesela Calisan adında bir sınıf olsun. Her çalışanın sahip olabileceği ortak özellikler bu sınıfta tanımlansın.

class Calisan
{
    public string Id { get; set; }
    public string Isim { get; set; }
    public string Departman { get; set; }
    public decimal Maas { get; set; }

    public void BilgiVer()
    {
        Console.WriteLine("İsim: " + Isim + "\nDepartman: " + Departman + "\nMaaş: " + Maas + " TL");
    }
}

Bu sınıf, çalışanların benzersiz bir kimliği (Id’si), ismi, departmanı ve maaşı olacağını gösteriyor. (Ad ve soyad gerçekte ayrı ayrı tutulmalıdır, ben kodu uzatmamak adına böyle yazıyorum)

Şimdi Memur adında bir sınıf tamımlayalım.

class Memur
{
    public string Id { get; set; }                // tekrar eden
    public string Isim { get; set; }              // tekrar eden
    public string Departman { get; set; }         // tekrar eden
    public decimal Maas { get; set; }             // tekrar eden

    public decimal SaatBasinaUcret { get; set; }  // ilave
    public int EkMesaiSaati { get; set; }         // ilave

    public void BilgiVer()                        // tekrar eden
    {
        Console.WriteLine("İsim: " + Isim + "\nDepartman: " + Departman + "\nMaaş: " + Maas + " TL");
    }

    public decimal EkMesaiUcretiHesapla()         // ilave
    {
        EkMesaiSaati * SaatBasinaUcret;
    }
}

Dikkat edilirse bu sınıfta Calisan sınıfıyla ortak alanlar var. Id, Isim, Departman ve Maas alanları ve BilgiVer() metodu bu sınıfta aynen tekrar ediyor. Bunu böyle yapıp kodu uzatmaktansa şunu yapabiliriz.

class Memur : Calisan
{
    public decimal SaatBasinaUcret         // ilave
    public int EkMesaiSaati                // ilave

    public decimal EkMesaiUcretiHesapla()  // ilave
    {
        return EkMesaiSaati * SaatBasinaUcret;
    }
}

Yukarıdaki sınıfın, “class Memur : Calisan” şeklinde tanımlandığını görüyorsunuz. Bu, Memur‘un bir Calisan olduğunu, Calisan‘da ne varsa Memur‘da da olacağını söyler. Yukarıda verdiğim ilk Memur sınıfı (kod tekrarı olduğunu söylediğim), işte bu sınıfla tamamen aynıdır. Yani Id, Isim, Departman ve Maas özellikleri ve BilgiVer() metodu Calisan‘dan tevarüs edilmiştir. Bu sınıfa has olmak üzere, ilave olarak SaatBasinaUcret ve EkMesaiSaati özellikleri ve EkMesaiUcretiHesapla() metodu tanımlanmıştır.

Aynı örneği Amir için de yapalım.

class Amir : Calisan
{
    public int IdaresindekiMemurSayisi { get; set; }
    public int PerformansPuani { get; set; }
    public decimal Prim { get; set; }

    public void MemurlaraMesajGonder()
    {
        Console.WriteLine("Memurlara mesaj gönderiliyor...");
    }

    public void PrimHesapla()
    {
        Prim = Maas * (PerformansPuani / 100.0m);
    }
}

Burada da, Calisan‘dan devraldığımız özellik ve metodlara ilave olarak yeni özellik ve metodlar tanımladık. Amir‘in IdaresindekiMemurSayisi, PerformansPuani ve Prim gibi kendine has özellikleri ve MemurlaraMesajGonder(), PrimHesapla() gibi yine kendine has metodları bulunuyor.

Örneği özetlemek gerekirse; Calisan üst (base class), Amir ve Memur ondan türemiş (derived class) olarak tanımlanmıştır. Dilersek türemiş sınıflardan da başka sınıflar türetebiliriz.

Küçük bir alıştırma olarak şunu da size bırakıyorum:
Memur sınıfından iki alt sınıf daha türetin: Sozlesmeli ve Kadrolu
(Her ne kadar sözleşmeli çalışanlar resmi memur statüsünde olmasa da 657 sayılı Devlet Memurları Kanununa tabi olduklarından kod arkaplanı için böyle düşünmekte bir beis yok)

Sıradaki yazımız: Soyutlama (Abstraction) Nedir? Interface ve Abstract Class Farkı (2/4)

Ayrıntılı bilgi için: C# Documentation – Inheritance

Şunlar da ilginizi çekebilir...

Bir yanıt yazın

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