9 Mart 2011 Çarşamba

C# Inheritance

Inheritance (Kalıtım), Object Oriented Felsefesinin 3 temel taşından biridir.   Programlama yaparken yaptığımız olay aslında, gerçek hayattaki nesneleri modellemektir. İşte nesneler arasındaki bu ilişkiyi, programdaki nesnelerimize uygulama olayına kalıtım deriz. Temelde belirttiğimiz ilişki, “is a” ya da “has a” ilişkisidir aslında.

Mesela bir şirketteki Personeller için bir sınıf yazacağımızı düşünelim. Basit olarak, tüm personellerin sicil numarası, ad ve maaş bilgilerinin tutan bir sınıf tasarlayalım.

class Personel

        {

            long _sicilNo;

            string _ad;

            double _maas;

 

            public long SicilNo

            {

                get { return _sicilNo; }

                set { _sicilNo = value; }

            }

 

            public string Ad

            {

                get { return _ad; }

                set { _ad = value; }

            }

 

            public double Maas

            {

                get { return _maas; }

                set { _maas = value; }

            }

 

            public Personel(int sicilNo, string ad, double maas)

            {

                SicilNo = sicilNo;

                Ad = ad;

                Maas = maas;

            }

        }

Şimdi de Müdür sınıfı tasarlamaya çalışalım. Müdür’ün de sicil numarası, adı ve maaşı mevcuttur. Aynı zamanda; müdür de bir personeldir. İşte bu noktada Müdür sınıfımızı tasarlarken “Müdür is a Personel” ilişkisini belirtmeye çalışalım.

class Mudur : Personel

    {

        string _sorumluOlduguDepartman;

 

        public string SorumluOlduguDepartman

        {

            get { return _sorumluOlduguDepartman; }

            set { _sorumluOlduguDepartman = value; }

        }

 

        public Mudur(long sicilNo, string ad, double maas, string sorumluOlduguDepartman)

            : base(sicilNo, ad, maas)

        {

            SorumluOlduguDepartman = sorumluOlduguDepartman;

        }

    }

Yukarıdaki tasarım ile Mudur’un de bir Personel olduğunu belirtmiş olduk. Bu sayede hem daha doğru bir tasarım yaptık, hem de sicilNo, ad, maas gibi alanları tekrar tanımlama gereği duymadık. Burada görmemiz gereken diğer bir kavram da “base” anahtar sözcüğüdür. burada base anahtar sözcüğünü kullanarak constructor yönlendirmesi yaptık. Böylece, zaten personel sınıfında varolan sicilNo, ad ve maas field’larının Personel sınıfından gelmesini sağlamış olduk.

Şimdi Program tarafında bu iki sınıfın nesnelerini oluşturalım.

class Program

    {

        static void Main(string[] args)

        {

            Personel pers = new Personel(123456789, "onur", 5000);

 

            Mudur mdr = new Mudur(987654321, "ali", 8000, "ARGE");

 

        }

    }

Burada akıllara bir soru gelebilir. Madem Mudur de bir Personeldi, o halde bir mudur nesnesi personel tipinden bir değişkende tutulabilir mi? Elbette tutulabilir. Zaten bu, kalıtımın bize sağladığı bir özelliktir.

class Program

    {

        static void Main(string[] args)

        {

            Personel pers = new Mudur(987654321, "ali", 8000, "ARGE");

        }

    }

Bu noktada da başka bir sorun ile karşı karşıyayız. Yukarıdaki kod parçasına göre; pers. dediğimizde, new ile örneklediğimiz nesnemiz “Mudur” tipinden olmasına rağmen “sorumluOlduguDepartman” property’sini göremeyeceğiz. Bunun sebebi ise tip güvenliğinin korunmasıdır. nesneyi tutan değişkenin tipi “Personel” dir. Dolayısı ile bu işaretçi üzerinden, sadece o işaretçi tipinin üyelerine erişebiliriz.

Eğer “sorumluOlduguDepartman” property’sine ulaşmak istersek, pers değişkeni üzerinde cast işlemi yapmamız gerekmektedir.

((Mudur)pers).SorumluOlduguDepartman = "Hardware";

 



16 yorum:

oğuz dedi ki...

süper anladım yemin ediyorum :)

Onur Salkaya dedi ki...

Faydalı olmasına sevindim.

KORKUT dedi ki...

çok faydalı ve düzenli bir bloğunuz var teşekkürler..

Onur Salkaya dedi ki...

Değerli yorumunuz için ben teşekkür ederim, iyi çalışmalar.

Beyhan Gül dedi ki...

public Personel(int sicilNo, string ad, double maas)
{
SicilNo = sicilNo;
Ad = ad;
Maas = maas;
}

burdakı sicilNo int tipinden değil long olacak kardeşim.güzel paylaşımmış tebrık ederim

Oktay Ersoy dedi ki...

Teşekkürler...

Adsız dedi ki...

Base sınıfta parametreli ya da parametresiz bir metod olursa türetilen sınıfta nasıl işlem yapılacak?

Adsız dedi ki...

yazılarınıza keşke devam etseniz mahrum bırakmasanız bizi..

Adsız dedi ki...

Anlatımınız, örnekleriniz tam anlamıyla nefis bir şekilde MÜHENDİSLİK kokuyor.Heryerde OOP anlatılıyor ama bukadar mı güzel anlatılır,. Haddime değil ama sizi tebrik ederim, başarılarınızın devamını dilerim ..Emeğinize sağlık çok teşekkürler.

Adsız dedi ki...

Bir sorum olacak , örnekte base kullandık ama base kullandığımız zaman program nerden anladıda personel classındaki constuctorı gördü. Personel sınıfnda başka bir metod olsaydı 3 parametre alan onu görmesini isteseydik nasıl olacaktı ? Biraz açıklayabilirmisiniz ?

Adsız dedi ki...

Base herzaman yapıcı metodlarla mı ilişkilidir.

Onur Salkaya dedi ki...

Merhaba,

OOP felsefesi gereği bir nesne örneği ram'e çıktığında, beraberinde o nesne örneğinin kalıtıldığı tiplerin de nesne örnekleri ram'e çıkar. Burada Mudur tipinden bir nesne oluştururken, Personel ve Object tipinden de bir nesne oluşur. Mudur içerisindeki base anahtar sözcüğü ram üzerindeki Personel tipinden olan nesne örneğini işaret eder.

Tüm tipler içerisinde this ve base anahtar sözcüklerinin önemi büyüktür. this ile ilgili metot hangi nesne örneği üzerinden çağırılmışsa o nesne örneğinin referansı elde edilir. base anahtar sözcüğü ile de ilgili tipin kalıtıltığı tipten olan nesne örneğine erişiriz.

Adsız dedi ki...

Çok teşekkür ederim cevap verdiğiniz için bir sorum daha var. Personel classında 2 tane daha property oluşturdum , int id , string soyad diye. birde kisiBilgi(int id , string soyad) diye metod tanımladım personel sınıfnda. Sonra gittim Mudur classında, sizin oluşturduğunuz ," public Mudur(long sicilNo, string ad, double maas, string sorumluOlduguDepartman) : base( .. dedğim zaman bnm personel sınıfnda kisiBilgi metodumu görmesini istedim orayı base olarak kullanmak istedim olmadı. Sonra yine Mudur classında kendim bir metod oluşturdum :base yaptım yine kisiBilgi metodunu görmedi. Bunun nedeni nedir acaba. Çünkü siz OOP felsefesi gereği bir nesne örneği ram'e çıktığında, beraberinde o nesne örneğinin kalıtıldığı tiplerin de nesne örnekleri ram'e çıkar.dedinz burdaki denemelerimde neden bu olmadı. Bunun cevabı olarak constructorlar için kullanıldığını düşüyüroum base anahtar sözcüğünün ?

Onur Salkaya dedi ki...

base anahtar sözcüğünü başına " : " (iki nokta) işareti koyarak kullanamazsınız. Personel sınıfındaki "kisiBilgi" metodunuza, Mudur sınıfı içerisinde static olmayan herhangi bir metot içerisinde base anahtar sözcüğünden sonra nokta işaretine bastığınızda erişebilirsiniz (metot private değilse).

Constructor (yapıcı) metotlarda " : " işaretini kullanmamızın sebebi özeldir. Burada constructor yönlendirmesi yaptığımız için iki nokta işaretini kullandık. Herhangi bir metot içerisinde bu işaret ile kullanamayız.

Nurlan dedi ki...

Merhaba Hocam ,faydali anlatimlar icin tesekkurler.Hocam



class Program

{

static void Main(string[] args)

{

Personel pers = new Mudur(987654321, "ali", 8000, "ARGE");

}

}

Bu yukardaki kod parcasindaki gibi Mudur turunden bir sinifi kurupta Personel tipinden bir referansa aktardigimizda belleyin STACK ve HEAP alanlarinda hangi prosesler isleniyor ve Personel tipinden bir referansi geriye Mudur tipindeki bir referansa cast yaparkan bellekte nasil bir proses oluyor ? Resim uzerinde anlatsaniz cok guzel olur ?

Adsız dedi ki...

Merhaba,
Çok düzenli ve sade anlatımınız için teşekkür ederim.

Public sınıfı içinde, Personel constructor int sicilNo yerine long sicilNo olmalı diye hata veriyor kodlar.

public Personel(int sicilNo, string ad, double maas)
{

Yorum Gönder