C# : Kalıtım

c sharp 150x150 C# : Kalıtım  dot net c sharp Merhaba arkadaşlar, bu dökümanda C# da kalıtıma giriş yapacağız. Kalıtım nedir ne değildir ona göz atalım.

Kalıtım nesne yönelimli programlamanın en önem özelliğidir. Kalıtım ile nesneler birbirinden türetilir. Türetilen sınıf türediği sınıfın tüm özelliklerini kalıtım yolu ile devralır. Şunuda unutmayalım kalıtım yolu ile sadece public ve protected elemanlar aktarılır (Yazının devamında private elemanlara nasıl ulaşılacağını göstereceğim.). C# da birbirinden türemiş bi hayli sınıf bulunmaktadır.  Nesnenin türediği sınıfa base sınıf denir.

Türetme işlemi : operatörü ile yapılır. Bilgi olması açısından veriyorum ; Örneğin StringBuilder yazıp sağ tuşla bastıktan sonra “Go To Defination” a basın ardından açılan sayfada StringBuilder sınıfının base sınıfını görebilirsiniz.

Gelin bir örnek üstünde iyice irdeleyelim.  Bir emlak uygulaması yapalım.

Ev base sınıfımız, SatılıkEv de türeyen sııf olsun

using System;

namespace KalıtımBlog
{
    class Ev
    {
        public string semt;
        public int alan;
        public string adres;

        public void evGoster()
        {
            Console.WriteLine("Evin özellikleri ; nSemti: {0}nAlanı: {1}nAdresi:{2}", semt, alan, adres);
        }

    }

    //SatilikEv sınıfının base sınıfını Ev olarak tanımlıyoruz
    class SatilikEv : Ev
    {
        public int fiat;

        public void fiatGoster()
        {
            Console.WriteLine("Fiatı : {0}", fiat);
        }

    }
    class Program
    {
        static void Main(string[] args)
        {
            SatilikEv ev = new SatilikEv();
            ev.adres = "Mehmet Cenk Sokağı No:23";
            ev.alan = 250;
            ev.semt = "Beyoğlu";
            ev.fiat = 1000;
            ev.evGoster();
            ev.fiatGoster();

            Console.WriteLine("n2.Ev Yazdırılıyor..n");

            SatilikEv ev2 = new SatilikEv();
            ev2.adres = "Cennet Mahallesi Bilmem Ne Sokağı No:23";
            ev2.alan = 157;
            ev2.semt = "Beykızı";
            ev2.fiat = 2680;
            ev2.evGoster();
            ev2.fiatGoster();

            Console.Read();
        }
    }

}

Programı çalıştırdığımızda çıktı aşağıdaki şekil olmalıdır ;

Evin özellikleri ;
Semti: Beyoğlu
Alanı: 250
Adresi:Mehmet Cenk Sokağı No:23
Fiatı : 1000

2.Ev Yazdırılıyor..

Evin özellikleri ;
Semti: Beykızı
Alanı: 157
Adresi:Cennet Mahallesi Bilmem Ne Sokağı No:23
Fiatı : 2680

19. Satırda görüleceği gibi SatilikEv i Ev sınıfından türettik, bu türeme işleminden sonra Ev sınıfındaki bütün public elemanlar SatilikEv sınıfına aktarıldı. Main metodumuzda da rahat bir şekilde kullanabildik. Ve Ev.fiatGoster(); geçersiz bir kullanımdır çünkü Ev sınıfı türeyen nesnenin özelliklerini kesinlikle taşımaz. Türeyen sınıfın içerisinde base sınıfa rahatlıkla ulaşabiliyorsunuz, base anahtar sözcüğüyle. Örneğin base.alan dediğinizde Ev sınıfının içerisindeki alan fieldine ulaşır.

Daha önce belirttiğim gibi sadece public elemanlar geçiyor, siz private birşey tanımlarsanız onu türettiğiniz sınıfta kullanamayacaksınız. Private field lara ulaşabilmeniz için get ve set blokları tanımlayabilirsiniz. Bunu field a sağ tuşla basıp ; “Refactor>Encapsulate field>Ok” ile yapabilirsiniz.

Bunun haricinde protected erişim belirleyicisini kullanabiliriz. Tanımladığımız fieldleri türetilen sınıfta rahatlıkla kullanmamıza olanak veriyor. Ama biz bunu Main metodunda kullanamayız, protected erişim belirleyicisi ile tanımlanmış elemanlara sadece türetilen sınıf üzerinden ulaşabiliriz, elemanın güvenliği için böyle bir yol izlenmiştir. Aksi takdirde Ev sınıfında öyle bir field düşünün ki değeri değiştiğinde sizin tüm sınıflarınızdaki verilerin değerleriyle bağlantılı olsun siz bu field e ulaşılmasına izin verirseniz, değeri değiştirildiğinde kötü sonuçlar ortaya çıkabilir. Aşağıdaki program derlenmeyecektir çünkü protected ile tanımladığımız field lara Main metodu üzerinden değer ataması yapmaya çalışıyoruz.

using System;

namespace KalıtımBlog
{
    class Ev
    {
        protected string semt;
        protected int alan;
        protected string adres;

        public void evGoster(string semt)
        {
            Console.WriteLine("Evin özellikleri ; nSemti: {0}nAlanı: {1}nAdresi:{2}", semt, alan, adres);

        }

    }

    class SatilikEv : Ev
    {
        public int fiat;

        public void fiatGoster()
        {
            Console.WriteLine("Fiatı : {0}", fiat);

        }

    }
    class Program
    {
        static void Main(string[] args)
        {
            SatilikEv ev = new SatilikEv();
            ev.adres = "Mehmet Cenk Sokağı No:23";
            ev.alan = 250;
            ev.semt = "Beyoğlu";
            ev.fiat = 1000;
            ev.evGoster();
            ev.fiatGoster();

            Console.Read();
        }
    }

}

Değer atama işlemlerini nasıl yapacağız o zaman ? Diye sorarsanız ; Cevabı : Sınıfı kurarken değerleri isteyebiliriz. Son olarak programımız aşağıdaki şekilde olacaktır.

using System;

namespace KalıtımBlog
{
    class Ev
    {
        protected string semt;
        protected int alan;
        protected string adres;

        public Ev(string semt, int alan, string adres)
        {
            this.semt = semt;
            this.alan = alan;
            this.adres = adres;
        }

        public void evGoster()
        {

            Console.WriteLine("Evin özellikleri ; nSemti: {0}nAlanı: {1}nAdresi:{2}", semt, alan, adres);

        }

    }

    class SatilikEv : Ev
    {
        public int fiat;

        public SatilikEv(string semt,int alan,string adres ,int fiat):base(semt,alan,adres)
        {
            this.fiat = fiat;
        }

        public void fiatGoster()
        {

            Console.WriteLine("Fiatı : {0}", fiat);
        }

    }
    class Program
    {
        static void Main(string[] args)
        {
            SatilikEv ev = new SatilikEv("Semtimiz", 200, "Adresimiz", 2598);
            ev.evGoster();
            ev.fiatGoster();

            Console.Read();
        }
    }

}

Şimdi yukarıdaki programda ne işlemler yaptık sırasıyla göz atalım;
11.Satırda oluşturduğumuz constructor ile field değerlerini dışarıdan aldık ve atamaları gerçekleştirdik.
31.Satırda SatilikEv için bir constructor oluşturduk fakat bu constructor sıradan bir constructor değil, burada base anahtar sözcüğü göze çarpıyor. Biz daha önce de belirttiğimiz gibi 11. satırda Ev base sınıfı için bir constructor oluşturmuştuk ve dışarıdan değer alıyordu, biz bu constructora mecburen değer atamak zorundayız, bunu da SatilikEv‘in constructor ini çağırırken gerçekleştiriyoruz. Kısacası : base sınıfın constructor ına burada değer ataması yapılıyor. base(semt,alan,adres) buradaki değerler öncesinde tanımlanan semt,alan ve adres değişkenleridir. Bu değişkenleri Ev construcotruna gönderiyoruz.

Not: Türeyen nesne kurulurken her zaman türediği sınıf arkaplanda otomatik olarak kurulur. Ve her zaman önce base sınıf kurulur.

Türetilen nesnelerin türediği sınıflar her zaman en sade şekilde olmalıdır, gidipte Ev sınıfında Fiat diye bir field tanımlamak yanlış olur çünkü ; İleride oluşturacağınız bir KiralikEv sınıfında bu fuzuli bir eleman olacağından en sade şekilde tanımlamak mantıklı ve kullanışlıdır.

Konuyla alakalı sorularınız varsa buyrun sorun icon smile C# : Kalıtım  dot net c sharp
Vesselam.

Tags: , , , , , ,

4 Comments

  1. Gayet yalın ve özlü bi anlatım olmuş…teşekkürler…bu arada SEO çalışmalarınız iyi

  2. Paylaşım için Teşekkürler . Bu arada sitenin tasarımı mükemmel olmuş. :)

  3. Gerçekten de çok güzel anlatmış tebrikler.

Yorum yaz

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Ads