Merhaba arkadaşlar bu konumda sizlerle birlikte Dart Programlama 'nın yapıcı/kurucu metot kullanımını yani constructor 'u lanse edeceğim.Hemen konuya geçelim.
Bir sınıftan nesne oluşturduğumuz anda çalışmasını istediğimiz sınıf fonksiyonuna yapıcı/kurucu metot (constructer) diyoruz.
Her sınıfın varsayılan, içi boş bir yapıcı metodu vardır.
Örneğin ArabaTasarimi sınıfının varsayılan kurucu metodu
Kod:
ArabaTasarimi(){}
ya da
Kod:
ArabaTasarimi();
şeklinde ifade edilebilir.
Kullanabilmek için bu yazımlardan birini tercih ederek oluşturduğumuz sınıfın içinde yazmamız gerekir.
Kod:
class ArabaTasarimi {
ArabaTasarimi();
}
Peki kurucu metot ne işimize yarıyor, onu nasıl kullanıyoruz.
Eğer bir nesnenin oluşturulurken bir değer verilerek oluşturulmasını ve oluşturulduğu anda bu değerle bir takım işler yapmasını istiyorsak kurucu metotları kullanırız.
Örneğin biz önceki konumuzda ArabaTasarimi sınıfına renk diye bir özellik vermiş ama değer atamamıştık.
Kod:
class ArabaTasarimi {
String renk;
ArabaTasarimi();
}
Nesneyi oluşturduktan sonra renk değeri vermiştik.
Kod:
ArabaTasarimi kirmiziAraba = ArabaTasarimi();
kirmiziAraba.renk = "Kırmızı";
Ama eğer sınıfı oluştururken kurucu metodu kullansaydık, nesneyi oluşturma aşamasında da kirmiziAraba'nın renk özelliğine "Kırmızı" değerini verebilirdik.
Kod:
class ArabaTasarimi {
String renk;
ArabaTasarimi(this.renk);
}
Kurucu metodun parantezleri içinde yazdığımız this.renk ifadesi, bu sınıfın içinde yazdığımız String renk değişkenini temsil ediyor. Yani this diyerek ArabaTasarimi sınıfının içindeki renk değişkeni olduğunu belirttik. Bu belirtmeyle birlikte eğer bu sınıftan bir nesne oluşturulacaksa, nesne oluşturulduğu anda bir değer vermemiz gerektiğini ve bu değerin renk değişkenine atanacağını ifade etmiş olduk.
Şimdi nesneyi oluşturalım.
Kod:
ArabaTasarimi kirmiziAraba = ArabaTasarimi("Kırmızı");
print(kirmiziAraba.renk);
Konsol Çıktısı:
Kod:
Kırmızı
Bu değişiklikler sadece bu nesne özelinde geçerlidir. Aynı sınıftan yeni bir nesne ürettiğimizde o sadece sınıfın varsayılan özelliklerini alacaktır. Kurucu metodu için vermemiz gereken değer de sadece o nesneye özel olacaktır.
Sınıfın birden fazla özelliği de olabilirdi. Bu durumda yapıcı metodun alacağı değerleri virgülle ayırarak hepsini yazabiliriz.
Kod:
class ArabaTasarimi {
String renk;
int uretimYili;
String silecekDurumu;
ArabaTasarimi(this.renk, this.uretimYili, this.silecekDurumu);
}
Nesneleri oluştururken de yapıcı metodun parantezleri içindeki tüm değerleri aynı sıra ile yazmamız gerekir.
Kod:
ArabaTasarimi kirmiziAraba = ArabaTasarimi("Kırmızı", 1972, "Çalışıyor");
ArabaTasarimi kirmiziAraba = ArabaTasarimi("Beyaz", 1972, "Çalışmıyor");
Şimdi işin içine fonksiyonları da dâhil edelim.
Kod:
class ArabaTasarimi {
String renk;
int uretimYili;
String silecekDurumu;
silecekleriCalistir(){
print("Silecekler $silecekDurumu");
}
ArabaTasarimi(this.renk, this.uretimYili, this.silecekDurumu);
}
Artık nesneyi oluşturduktan sonra sınıf fonksiyonunu çalıştırdığımızda bize sileceklerin durumunu belirten bir mesaj gösterecek.
Kod:
ArabaTasarimi kirmiziAraba = ArabaTasarimi("Kırmızı", 1972, "Çalışıyor");
ArabaTasarimi kirmiziAraba = ArabaTasarimi("Beyaz", 1972, "Çalışıyor");
kirmiziAraba.silecekleriCalistir();
beyazAraba.silecekleriCalistir();
Kod:
Silecekler Çalışıyor
Silecekler Çalışmıyor
Eğer isteseydik constructer içeriğini aşağıdaki gibi yazarak fonksiyonların yaptığı işleri de yaptırabilirdik. Böylelikle nesne oluşturulduğu anda bu işler otomatik olarak yapılırdı. Bunun için constructer'ı normal fonksiyon yapısı gibi süslü parantezlerle birlikte yazmalıyız.
Kod:
class ArabaTasarimi {
String renk;
int uretimYili;
String silecekDurumu;
ArabaTasarimi(this.renk, this.uretimYili, this.silecekDurumu){
print("$renk Arabanın Silecekleri $silecekDurumu");
}
}
Nesneler oluşturulduğu anda kurucu metot çalışacağı için, metodun süslü parantezleri arasına yazdığımız print fonksiyonu da otomatik olarak çalışacak ve içindekileri konsola yazdıracak.
Kod:
ArabaTasarimi kirmiziAraba = ArabaTasarimi("Kırmızı", 1972, "Çalışıyor");
ArabaTasarimi kirmiziAraba = ArabaTasarimi("Beyaz", 1972, "Çalışmıyor");
Konsol Çıktısı:
Kod:
Kırmızı Arabanın silecekleri Çalışıyor
Beyaz Arabanın silecekleri Çalışmıyor
Şimdi kurucu metotların daha farklı şekillerde nasıl tanımlanabileceğine bakacağız ve bu sırada this anahtar kelimesini de daha iyi anlayabileceğimiz bir örneğimiz olacak.
Yukarıda yaptığımız örneklerde direkt kurucu metodun parantezi içine this.renk yazarak nesne oluştururken aldığımız değeri, sınıfın String renk değişkenine atayabilmiştik. Ama aslında kurucu metotların gerçek hâli aşağıda olduğu gibidir. Böylelikle farklı bir değişken ismi olan String boyaRengi ile nesne oluştururken verilen değeri (örneğin "Kırmızı" yı) alıyoruz daha sonra da sınıfın renk değişkenine başka bir kod satırı ile atıyoruz.
Kod:
class ArabaTasarimi {
String renk;
ArabaTasarimi(String boyaRengi){
renk = boyaRengi;
}
}
Yukarıdaki kodda bir sıkıntı yok. Onu kullanabilirsiniz. Ancak bu kodları aşağıdaki gibi yazmak istediğimizde this anahtar kelimesinin anlamı ortaya çıkıyor.
Kod:
class ArabaTasarimi {
String renk;
ArabaTasarimi(String renk){
this.renk = renk;
}
}
Burada kurucu metodun parantezleri arasına yazdığımız değişken ile, sınıfın varsayılan değişkeninin isimleri aynı: renk
Programın bu değişkenleri ayırt edebilmesi için this ifadesini kullandık. this.renk demek, sınıf özelliği olarak tanımladığımız String renk demek.
Kod:
this.renk = renk
Bu kodun sağına sadece renk olarak yazdığımız değişken ise kurucu metodun parantezleri arasındaki değişkeni ifade ediyor.
İşte this ifadesinin bu tip karışıklıkları önlemek ve değer atama işlemlerini ilk örneklerde gördüğümüz şekilde kısaltmak gibi işlevleri var.
İsimlendirilmiş Constructer
Eğer birden fazla kurucu metoda ihtiyaç duyarsak, isimlendirerek yeni kurucu metotlar oluşturabiliyoruz. Aşağıdaki satırda sınıf adından sonra sadece nokta koyup bir isim verdim. Artık toplam üç tane kurucu metodum olmuş oldu. Normal kurucular için geçerli olan her şey bunlar için de geçerli.
Kod:
class ArabaTasarimi {
String renk;
int uretimYili;
ArabaTasarimi();
ArabaTasarimi.ikinciKurucu(this.renk);
ArabaTasarimi.ucuncuKurucu(int uretimYili){
this.uretimYili = uretimYili;
}
}
Kullanımları için de aynı şey geçerli. Tek fark, bir nokta koyup isimlendirilmiş kurucunun adını yazmak.
Kod:
ArabaTasarimi kirmiziAraba = ArabaTasarimi.ikinciKurucu("Kırmızı");
ArabaTasarimi kirmiziAraba = ArabaTasarimi.ucuncuKurucu(1972);
Değerleri Süslü Parantezle Almak
Eğer aşağıdaki gbi kurucu metotların normal parantezleri içerisinde ekstra süslü parantez kullanırsa ve alınmasını belirttiğimiz değerleri süslü parantezler içerisine yazarsak, nesne oluşturma sırasında bunların verilmesi zorunlu değil demiş oluruz.
Kod:
class ArabaTasarimi {
double fiyat;
String renk;
int uretimYili;
ArabaTasarimi({this.fiyat});
ArabaTasarimi.ikinciKurucu({this.renk, this.uretimYili});
ArabaTasarimi.ucuncuKurucu({int uretimYili}) {
this.uretimYili = uretimYili;
}
}
Bu durumda, nesne oluştururken aşağıdaki şekilde sınıfın hangi özelliğine hangi değeri verdiğimizi belirtmemiz gerekir. Yani artık nesne oluştururken değer vermek zorunda değiliz.
Kod:
var kirmiziAraba = ArabaTasarimi.ikinciKurucu();
Ama verirsek de aşağıdaki gibi değişken adını yazıp iki nokta koymamız gerekiyor.
renk: "Mavi"
uretimYili: 1973;
gibi.
Kod:
var kirmiziAraba = ArabaTasarimi.ikinciKurucu(renk: "Mavi", uretimYili: 1973);
print(kirmiziAraba.renk);
print(kirmiziAraba.uretimYili);
Okuduğunuz için teşekkür ederim arkadaşlar normalde Mobil Programcılık serimiz sona ermişti fakat böyle bir bonus eklemek istedim.Ek olarak bu konuları erişilebilirlik açısından tek konu altında bulabilirsiniz.Tıkla Esen kalın