Inheritance, Miras, Kalıtım

İster kalırım, ister miras deyin, teknik olarak da inheritence olarak adlandırdığımız şey, daha önceden oluşturulmuş bir classa ait özelliklerin bir başka class içinde kullanılması işlemidir. Yani örneklersek, ben bir class ürettim, ayrıca bir class daha üretiyorum, bu yeni ürettiğim classta da bir takım özellikleri tanımladım. Ama bu class aynı zamanda daha önce ürettiğim classın da özelliklerine sahip olacak, bunun için önceki classtan inheritence alabilirim. Böylelikle bazen iki classı birleştirmek istediğimde bu yöntemle işimi kolaylaştırabilirim. Birazdan daha somut bir hale getireceğim ve konu daha net anlaşılacak. Burada türetilen sınıf base class, türeyen sınıf ise derived class olarak adlandırılır. Bu yazıya devam etmeden önce aşağıdaki iki yazıyı sırası ile okumanızı öneririm.

Şimdi üstte yer alan yazılarda yaptığımız örneğe geri dönelim. Ben Fiat diye bir sınıf oluşturmuştum. Diyelim ki bir showroomdayız ve Fiat marka araç satıyoruz. Bir araç da sattık, Sedan bir araç sattık. Bir de aracı sattığımız müşterinin ruhsat bilgilerini bir yerde tutacağız. İşte burada inheritence yolu ile ilk sınıftan özellikleri alıp, satışı yapılan araçlar için derived class kullanabilirim. Böylelikle sattığım araçlar için ruhsat bilgilerini ayrı bir classta toplayabilirim. Ben bunların hepsini en başta tek bir classta toplasa idim, satmadığım araçlar için de boşu boşuna ruhsat bilgilerini içeren alanlar olacaktı. Burada sınıfları bu şekilde bölmemin tamamen amacı gereksiz yere alan oluşturmamak. Şimdi örneğimizi kodlara dökelim;

Ben üstteki yazılarda yaptığım örnekte bir class daha ekliyorum. Bu classımın adı da RuhsatBilgileri.cs oluyor. Bu class içinde yeni özellikler bir başka deyişle yeni alanlar oluşturuyorum.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FiatClassOrnek
{
    class RuhsatBilgileri
    {
        public string plaka;
        public string motorSasiNo;
        public string MusteriAdSoyad;
        public string TescilTarih;
    }
}

Daha sonra Fiat sınıfıma dönüyorum. Orada da sınıf tanımlama kodumda şu değişikliği yapıyorum;

class Fiat : RuhsatBilgileri

Buradaki sınıfımın tüm kodlarını tekrar paylaşayım;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FiatClassOrnek
{
    class Fiat : RuhsatBilgileri
    {
        //Özelliklerime diğer formlardan erişim sağlanabilmesi için her bir özelliğimi public olarak tanımlıyorum.

        public string model;
        public string YakitTipi;
        public string VitesTipi;
        public string Renk;
        public string MotorTipi;
        public decimal fiyat;
        private int _ModelYil;

        public int ModelYil
        {
            //get ile karşıma çıkmasını istediğim değeri tanımlıyorum.
            get { return _ModelYil; }
            //Yıl eksi bile girilse mutlak değerini alarak düzenleme yapıyorum.
            set { _ModelYil = Math.Abs(value); }
        }


       
    }
}

Şimdi örnek olarak da Sedan.cs formumdaki EgeaSedan nesneme dönelim. Bu forma ayrıca 4 tane daha label ekliyorum. Bunlarda sırası ile şu isme sahipler:

lblPlaka

lblMotorSasi

lblMusteriAdSoyad

lblTescilTarihi

Daha sonra EgeSedan.cs formuma dönüyorum. Aşağıdaki şekilde kodları değiştiriyorum.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace FiatClassOrnek
{
    public partial class Sedan : Form
    {
        public Sedan()
        {
            InitializeComponent();
        }

        private void Sedan_Load(object sender, EventArgs e)
        {
            //Fiat sınıfından türeterek, EgeaSedan adında bir nesne oluşturdum. Artık Fiat sınıfında tanımladığım her bir özellik bu nesne tarafından erişilebilir durumda. Her bir özellik için uygun veri tipinde atama yapıyorum.
            Fiat EgeaSedan = new Fiat();
            EgeaSedan.model = "1.4 Fire Urban Plus";
            EgeaSedan.YakitTipi = "Benzinli";
            EgeaSedan.VitesTipi = "Manuel";
            EgeaSedan.Renk = "Kurşun Grisi";
            EgeaSedan.MotorTipi = "1.4";
            EgeaSedan.fiyat = 105900;
            //ModelYil aslında private ama ben bunu erişim belirleyici ile encapsule ederken public olarak tanımladığım için herhangi bir nesnemin formunda da erişim sağlayabilme imkanım oluyor.
            EgeaSedan.ModelYil = 2020;

            //Görüleceği üzere aşağıdaki gibi türemiş sınıfta burada kullanılabilmektedir.
            EgeaSedan.plaka = "34 XXX 00";
            EgeaSedan.motorSasiNo = "123456789";
            EgeaSedan.MusteriAdSoyad = "İsmail GÜRSOY";
            EgeaSedan.TescilTarih = "31.03.2020";

            //ilgili labellara yazdırma işlemimi yapıyorum.
            lblModel.Text = EgeaSedan.model;
            lblYakitTip.Text = EgeaSedan.YakitTipi;
            lblVitesTip.Text = EgeaSedan.VitesTipi;
            lblRenk.Text = EgeaSedan.Renk;
            lblMotor.Text = EgeaSedan.MotorTipi;
            lblFiyat.Text = EgeaSedan.fiyat.ToString();
            lblModelYil.Text = EgeaSedan.ModelYil.ToString();
            lblPlaka.Text = EgeaSedan.plaka;
            lblMotorSasi.Text = EgeaSedan.motorSasiNo;
            lblMusteriAdSoyad.Text = EgeaSedan.MusteriAdSoyad;
            lblTescilTarih.Text = EgeaSedan.TescilTarih;
        }
    }
}


Görüleceği üzere plaka, motor şasi no, müşteri ad soyad ve tescil tarihi gibi daha sonradan RuhsatBilgileri sınıfımda yer alan alanlara da daha önceden oluşturduğum EgeaSedan nesnesi içinde erişebiliyorum. Böylelikle miras alma işlemim gerçekleşmiş oluyor.

Şimdilik bu kadar 😊

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir