Giriş
✨Class, içerisinde field, property, metot, indexer gibi farklı memberlar barındıran ve bunlar eşliğinde ürettiğimiz nesne üzerindeki değerlerde işlem yapmamızı sağlayan tanımlayıcı bir yapılanmadır. Bu sınıftan üretilecek nesnenin üzerinde, bu nesnenin üretim esnasında/imha aşamasında yapılacak operasyonları tanımlamamızı sağlayacak özel fonksiyonlarımız vardır. Bu fonksiyonlar özel sınıf elemanlarıdır. Bu elemanlar tüm sınıflarda ortak olarak kullanılabilir yapılanmalara sahiptir. 3'e ayrılırlar:
- Constructor
- Static constructor
- Destructor
Constructor
🔸Constructor, bir nesne üretimi sürecinde tetiklenen ilk metottur.
🔸Nesne üretilirken belirli konfigürasyonları yaptığımız metottur. Nesne bu konfigürasyonlarla oluşturulsun, sonradan fonksiyon çağırmakla uğraşılmasın istendiğinde constructor'da konfigürasyonlar sağlanabilir.
🔸Constructor, nesne oluşturma sürecinde tetiklenmek zorundadır.
Yeni nesne oluştururken new operatörü kullandığımızı hatırlayalım:
new TypeX ( )
Burada parantez açıp kapatıyoruz. Bu esnada bir metot tetikliyoruz: Nesneyi inşa etmek için kullanılan Constructor metodu.
Constructor Davranış Modeli
Aşağıda bir nesnenin oluşturulma aşamasını gösteren bir örnek bulunuyor. Fieldların ilk değerlerinin nesne oluşturulma aşamasında verildiğini görüyoruz
Görüldüğü üzere, constructor işlevsel açıdan nesnelerin oluşturulma aşamasında içerisindeki fieldlara ilk değerlerini atamaya olanak sağlayan bir yapıdır.
📌Constructor, new ile nesne yaratma talebi geldikten ve ilgili nesneye hafızada yer ayrıldıktan sonra tetiklenir. Yani new yazıldığı anda nesne zaten oluşur ve nesne oluştuktan sonra ilk tetiklenen constructor ( ) olur.
Constructor Metot Nasıl Oluşturulur?
Constructor, özel bir sınıf elemanıdır ancak özel olsa da bir metot olduğu unutulmamalıdır. Bildiğimiz metot imzalarından biraz farklıdır.
Constructorların:
❕Metot adı sınıf adı ile aynı olmalıdır. (Özel sınıf elemanlarının dışında hiçbir memberın adı, class adı ile aynı olamaz!)
❕Geri dönüş değeri olmaz/tanımlanmaz. (void bile değil, direkt hiçbir tanımlama olmamalı.)
❕Erişim belirleyicisi public olmalıdır. (private olduğu istisnai durum vardır ve bu ayrıca incelenecektir.)
Aşağıdaki örnekte MyClass adlı sınıf içerisinde bir normal fonksiyon "X( )" bir de geri dönüş değeri tanımlanmamış, adı sınıf adı ile aynı olan ve erişim belirleyicisi public olan bir fonksiyon, yani bir constructor metot bulunuyor:
Default Constructor
Bir sınıf içerisinde herhangi bir constructor tanımlanmamış olabilir. Ancak her sınıfın içerisinde tanımlamasak dahi default bir constructor mevcuttur ve nesne üretirken tetiklenir.
Default constructor yerine kendimiz constructor verirsek, default olan ezilir ve yazdığımız geçerli olur.
Parametreli Constructor
Constructorlar parametre alabilen yapılardır.
Constructor Overloading
Constructorlar parametre alabildiği gibi overloading de yapılabilir fonksiyonlardır.
✨Overloading → Bir sınıf içerisinde aynı adı taşıyan birden fazla member olamaz. Dolayısıyla her metot farklı isimdedir. Eğer sınıf içerisinde aynı isimde birden çok metot oluşturulacaksa bunlar overloading/çoklu yükleme ile oluşturulur. Bu durumda imza yapılanması/metot cismi aynı kalır, sadece imza nitelikleri (parametre sayısı/türü/yeri) değişir. Bir overloading örneği:
Aynı kurallar constructor oluştururken de geçerli. Overloading'in tek farkı parametreler üzerinden kurulması.
Constructor'ın erişim belirleyicisini private yaparsak...
Constructor erişim belirleyicisi private ayarlandığında nesne üretiminde hata alınır, çünkü tetiklenmesi gereken ilk metodun tetiklenmesi engellenir.
Peki bunu ne zaman ve neden tercih edelim? Neden bir sınıftan nesne üretimini engelleyelim?: Singleton Design Pattern'da constructorlar private yapılır; bu şekilde nesne üretiminde dışarıdan erişim engellenir ama sınıfın içerisinde erişim yine de sağlanabildiği için sınıf içinde nesne oluşturulabilir. Yani nesneye dışarıdan erişimi engelleyip içeriden yönetmek istediğimiz bazı durumlarda kullanmak mantıklı olabilir.
this keywordü ile Constructorlar Arası Geçiş
✨Hatırlatma: this keywordü, bir class içerisinde o class'ın o anki nesnesini temsil eder. Aynı zamanda da bir class'ın nesnesinin içerisindeki birden fazla constructor arasında geçiş yapabilme sorumluluğunu da üstlenebiliyor. Örneğe bakalım:
Örnekte ikinci constructor yapısında birinci constructure this( ) ile çağrılmıştır. Proje çalıştırıldığında ilk tetiklenen, ikinci cons ile çağrılan birinci cons olacaktır. Yani önce "1. Constructor" yazısının ekrana geldiğini görürüz. Özetle bu işlem bir cons üzerinden farklı bir cons tetiklemeye yarar.
Recordlarda Constructor
Recordların esasında class'tan bir farkı olmadığı için class için geçerli olan şeyler recordlarda da geçerlidir. Parametre alabilir, overloading yapılabilir, this keyword'ü ile o anki nesnesinin temsili sağlanabilir.
0 yorum:
Yorum Gönder