Constructor Yapıcı Metotlar

Sınıflarda yer alan alanlara ilk değer atamak için kullanılmaktadır. Sınıftan bir nesne oluşturulduğunda çalıştırılmak istenildiği durumlarda kullanılmaktadır. Bilindiği üzere, nesneler sınıfların canlandırılmış halidir. Yani bir sınıfı ve üyeleri doğrudan kullanmak yerine ondan bir nesne üretip bunu nesne aracılığı ile kullanmayı tercih ediyoruz. Bir sınıftan nesne oluşturulduğunda, nesneyi hazırlayan şekillendiren yordamlar oluşur işte bunlara constructor (yapıcı) adı verilir. Constructor dışarıdan veri alabilir ancak geriye değer döndürmez. Bir sınıftan nesne oluşturduğumuz da yapılmasını istediğimiz işlemleri bu yordamlar yani constructor (yapıcılar) ile gerçekleştiririz. Constructors (yapıcılar) nesneleri oluşturmak için kullanılan new operatörü ile birlikte tetiklenirler.

Yapıcılar (constructors) sınıf ile aynı ismi taşırlar ve dışarıdan erişilebilecekleri için bu yordamın public olarak tanımlanması gerekmektedir. Bazı durumlarda programcının sınıftan bir instance oluşturmasını engellemek amacı ile private olarak tanımlanabilir.

Örnek bir constructor tanımlası verirsek :

public class kisi {

public kisi() {

//Yapılacak işlemler

}

}

Şimdi ilk örneğimiz de şunu yapacağız. Ben bir class tanımlayacağım. Bu classım içerisinde bir takım verileri ekrana yazdıran bir metot yazacağım. Çok basit bir örnek yapacağım ki konu net anlaşılsın.

Bir tane console projesi oluşturuyorum. Projeme bir class ekledim. Bu class adını Personel verdim. Personel.cs dokümanımda aşağıdaki kodları yazıyorum;

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

namespace ConsoleApp3
{
    class Personel
    {
        //yapıcı metotlarda metot adı ile class adı aynı olur.
        public Personel()
        {
            Console.WriteLine("Ad Soyad: İsmail GÜRSOY");
            Console.WriteLine("Ünvan: Mühendis");
        }
    }
}

Görüleceği üzere burada constructor, class ile aynı isimde yer alıyor.

Daha sonra program.cs dokümanımıza dönüyorum.

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

namespace ConsoleApp3
{
    class Program
    {
        static void Main(string[] args)
        {
            //Personel sınıfımdan sadece nesne üretmem yeterli. Yapıcı metotta yapılacak işlemler ne yazdı isem otomatik geliyor.
            Personel prsnl = new Personel();

            Console.Read();
        }
    }
}

Personel Classından ürettiğim prsnl nesnemi oluşturmam yeterli. Bu oluşturulduğunda artık o constructor içindeki yapılması gereken işlemler yapılıyor. Yani class içinde yer alan alanları çağırmak için tekrar metotla birlikte o alanları çağırmamıza gerek kalmıyor.

Bir başka örnekle devam edelim.Class içinde tanımladığımız yapıcı metot içerisinde parametreli kullanımı gösterelim bu sefer. Console ekranınada ad, soyad, yaş ve meslek bilgisi girilsin. Öncelikle sınıfımı oluşturalım;

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

namespace ConsoleApp3
{
    class Personel
    {
        //yapıcı metotlarda metot adı ile class adı aynı olur. Burda yapıcı metot içinde ayrıca parametre tanımlaması yaptım. Tüm parametrelerim string, işlem yapmadığım için.
        public Personel(string ad, string soyad, string dogumYil, string dogumYeri, string meslek)
        {
            Console.WriteLine("Ad: " + ad);
            Console.WriteLine("Soyad: " + soyad);
            Console.WriteLine("Doğum Yılı: " + dogumYil);
            Console.WriteLine("Doğum Yeri: " + dogumYeri);
            Console.WriteLine("Meslek: " + meslek);
                
        }
    }
}

Görüleceği üzere burada sınıfımla aynı ismi taşıyan bir constructor oluşturdum. Metoduma ait parametreleri de tanımladım. Akabinde yapılacak işlemleri belirttim.

Program.cs’ye dönüp kodlarımı yazıyorum:

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

namespace ConsoleApp3
{
    class Program
    {
        static void Main(string[] args)
        {           
            //Önce değişkenlerimi tanımlıyorum
            string _ad, _soyad, _dogumYil, _dogumYeri, _meslek;
            //Kullanıcıdan verileri girmesini istiyorum ve her bir veriyi ilgili değişkenime atama işlemi yapıyorum
            Console.WriteLine("Adınızı giriniz: ");
            _ad = Console.ReadLine();
            Console.WriteLine("Soyadınızı giriniz: ");
            _soyad = Console.ReadLine();
            Console.WriteLine("Doğum yılınızı giriniz: ");
            _dogumYil = Console.ReadLine();
            Console.WriteLine("Doğum yerinizi giriniz: ");
            _dogumYeri = Console.ReadLine();
            Console.WriteLine("Mesleğinizi giriniz: ");
            _meslek = Console.ReadLine();

            //Personel classından nesne oluşturuyorum ve ilgili parametrelerini belirtiyorum.
            Personel prsnl = new Personel(_ad, _soyad, _dogumYil, _dogumYeri, _meslek);

            Console.Read();
        }
    }
}

Öncelikle değişkenlerimi oluşturdum. Mateatiksel işlem vb yapmayacağım için tüm değişkenlerim string tipinde. Daha sonra kullanıcıdan veri girişi yapmasını istiyorum. Her bir girilen veriyi ilgili değişkenime Console.ReadLine() ile atadım. Daha sonra Personel sınıfımdan prsnl nesnesi oluşturdum ve daha önce tanımladığım değişkenleri parametre olarak belirttim.

constructor

Bir örnek daha yapalım, bu örnekte de ilk değer ataması yapılmış bir constructor metot yapalım.

Örneğimde yine personel isminde bir class oluşturacağım. Bu classımda yine personelin adı, soyadı, doğum yılı, doğum yeri ve ünvanı yer alacak. Doğum yılını bu sefer int tipinde yapalım.

Şimdi benim bu örneğimde amacım yapıcı metodumun her halükarda ilk değerlerinin olması. Şöyle bir senaryo düşünün, bir form doldurtuyorsunuz ancak bu formda boş geçilmesini istemediğiniz alanlar var veya boş geçilse bile sabit kabul edeceğiniz değerlerin yazmasını istiyorsunuz İşte burada yapıcı metot içinde ilk değer ataması kullanma yöntemine başvurabilirsiniz.

Şimdi örneğimize geri dönelim, console projesi açıyorum. Bir adet class ekledim. Adı Personel olsun, personel.cs dosyasına aşağıdaki kodları yazıyorum.

Bu arada metotlarım içerisinde encapsulation yaparak örneğimizi zenginleştirelim. Kod aralarında açıklama satırlarımı ekleyeceğim.

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

namespace ConsoleApp3
{
    //Personel adında bir class oluşturdum.
    class Personel
    {
        //class içinde 5 adet değişkenim var.
        string ad, soyad, dogumYeri, Unvan;
        int dogumYili;

        //Encapsulation işlemlerim
        public string _ad
        {
            get
            {
                return ad;
            }

            //Nasıl yazılırsa yazılsın ad değişkeninin içeriğinin hepsini büyük harf yapıyorum.
            set
            {
                ad = value.ToUpper();
            }
        }

        public string _soyad
        {
            get
            {
                return soyad;
            }
            //Nasıl yazılırsa yazılsın soyad değişkeninin içeriğinin hepsini büyük harf yapıyorum.
            set
            {
                soyad = value.ToUpper();
            }
        }

        public int _dogumYili
        {
            get
            {
                return dogumYili;
            }
            //Doğum yılının eksi yazılması vs gibi durumları gözeterek burada da Math fonksiyonunun Abs metodunu kullanarak, mutlak değer alma işlemini yaptırıyorum.
            set
            {
                dogumYili = Math.Abs(value);
            }
        }

        public string _dogumYeri
        {
            get
            {
                return dogumYeri;
            }
            //Nasıl yazılırsa yazılsın dogumYeri değişkeninin içeriğinin hepsini büyük harf yapıyorum.
            set
            {
                dogumYeri = value.ToUpper();
            }
        }

        public string _unvan
        {
            get
            {
                return Unvan;
            }
            //Nasıl yazılırsa yazılsın Unvan değişkeninin içeriğinin hepsini büyük harf yapıyorum.
            set
            {
                Unvan = value.ToUpper();
            }
        }


        //Constructor metodumu yazıyorum. Class ile aynı ismi taşıyor. Ve bu metodum içerisinde ilk sabit olması gereken değer atamamı yaptım. Veri girilmediğinde ad, soyad, doğumyeri ünvan için N/A yazsın istiyorum. Doğum yılı da girilmezse eğer 1900 yazsın istiyorum.
        public Personel()
        {
            ad = "N/A";
            soyad = "N/A";
            dogumYili = 1900;
            dogumYeri = "N/A";
            Unvan = "N/A";
        }
        
           
    }
}

Öncelikle Personel isminde class dokümanımın içerisinde değişkenlerimi tanımladım. 5 adet değişkenim var:  ad, soyad, dogumYili, dogumYeri, Unvan. Bu değişkenler içinde dogumYili değişkenim int tipinde, diğerleri ise string tipinde.

Örneğimi zenginleştirmek için encapsulation işlemleri de yaptım. Örnek olarak ad, soyad, doğum yeri ve unvan bilgileri kullanıcı tarafından nasıl girilirse girilsin toUpper() metodu ile tamamı büyük harfe çevriliyor. dogumYili ise negatif yıl girilmesini önlemek için Math fonskiyonunun Abs metodu kullanılarak mutlak değeri alınması sağlanıyor. Burada yer alan encapsulation işlemlerimi bitirdikten sonra yapıcı metodumu yazıyorum.

public Personel()
        {
            ad = "N/A";
            soyad = "N/A";
            dogumYili = 1900;
            dogumYeri = "N/A";
            Unvan = "N/A";
        }


Yapıcı metodum, class ile aynı isme sahip. Burada amaçlaıdğım işi yapıyorum aslında. Eğer kullanıcı değer girmezse ilk değer ataması işlemimi burada yapıyorum. Ad, soyad, doğum yeri, unvan bilgileri için varsayılan olarak N/A yazacak, doğum yılı bilgisi içinde varsayılan olarak 1900 yazacak.

Şimdi program.cs’ye dönüyorum. Kodlarımı yazıyorum;

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

namespace ConsoleApp3
{
    class Program
    {
        static void Main(string[] args)
        {
            //Personel classımdan prsnl adında bir nesne oluşturdum.
            Personel prsnl = new Personel();

            //Daha sonra ekrana yazdırma işlemlerimi yapıyorum.

            Console.WriteLine(prsnl._ad);
            Console.WriteLine(prsnl._soyad);
            Console.WriteLine(prsnl._dogumYili);
            Console.WriteLine(prsnl._dogumYeri);
            Console.WriteLine(prsnl._unvan);

            Console.Read();
        }
    }
}


Öncelikle Personel sınıfından prsnl adında bir nesne tanımladım. Daha sonra yazdırma komutlarımı yazdım. Eğer bu şekilde çalıştırırsam aşağıdaki gibi ilk değer atamalarını görebilirim.

Örnek olarak birkaç değer ataması yaparak örneğimizi bitirelim.

Kodlarımı aşağıdaki gibi düzenliyorum.

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

namespace ConsoleApp3
{
    class Program
    {
        static void Main(string[] args)
        {
            //Personel classımdan prsnl adında bir nesne oluşturdum.
            Personel prsnl = new Personel();

            prsnl._ad = "İsmail";
            prsnl._soyad = "Gürsoy";
            prsnl._unvan = "MüHenDiS";

            //Daha sonra ekrana yazdırma işlemlerimi yapıyorum.

            Console.WriteLine(prsnl._ad);
            Console.WriteLine(prsnl._soyad);
            Console.WriteLine(prsnl._dogumYili);
            Console.WriteLine(prsnl._dogumYeri);
            Console.WriteLine(prsnl._unvan);

            

            Console.Read();
        }
    }
}

Bu sefer ad bilgisine, soyad bilgisine ve unvan bilgisine veri girişi yaptım. Ancak ad bilgisindeki, soyad bilgisindeki ve unvan bilgisindeki yazı yazma şeklime özelilkle dikkat edin. Sınıf içindeki encapsulation işlemlerim ile bunların hepsi büyük harfe dönecek. Doğum yılı bilgisini girmediğim için varsayılan olarak 1900 yazacak. Doğrum yeri bilgisi de girmediğim için varsayılan olarak N/A yazacak. Böylelikle hem encapsulation işlemlerimin hem de yapıcı metodumum çalıştığını görebileceğim. Ekran çıktısı aşağıdaki şekilde;

Şimdilik bu kadar 🙂

Bir cevap yazın

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