Dart Konstruktor va destruktor

Sinf obyektini yaratish va obyekt holatini ishga tushirish uchun konstruktorlardan qo’llaniladi. Agar sinf konstruktori aniq belgilanmasa, u uchun avtomatik ravishda standart konstruktor yaratiladi va hech qanday parametrlarni qabul qilmaydi:

class Meva {
String nom = '';
int narx = 0;

void chiqarish() {
print('Nomi: $nom\nNarxi: $narx');
}
}

void main() {
Meva meva = Meva();
meva.chiqarish();
}

Lekin biz standart emas, balki o’z konstruktorlarimizni ham belgilashimiz mumkin. Sinfda o’z konstruktorlarimizni belgilash bizga obyekt yaratilganda bajariladigan sinfning maydonlariga ma’lum bir qiymatlarni yoki muayyan mantiqni o’rnatish imkonini beradi. Masalan:

class Meva {
String nom = '';
int narx = 0;

Meva(String mevaNom, int mevaNarx) {
nom = mevaNom;
narx = mevaNarx;
}

void chiqarish()=> print('Nomi: $nom\nNarxi: $narx');
}

void main() {
Meva meva = Meva('anor', 10000);
meva.chiqarish();
}
>> Nomi: anor >> Narxi: 10000

Hozir kodda Meva sinfi 2 ta parametrni qabul qiluvchi konstruktorni aniqlaydi va bu obyekt maydonlarining qiymatini o’rnatish uchun foydalaniladi. Konstruktor doimo sinf nomidan keyin nomlanishi kerak:

Meva(String mevaNom, int mevaNarx) {
nom = mevaNom;
narx = mevaNarx;
}

Konstruktorni o’zimiz belgilaganimiz uchun endi standart konstruktor yaratilmaydi. Endi Meva sinfidan obyekt yaratishimizda biz belgilagan konstruktorimizdan foydalanamiz.

Meva meva = Meva('anor', 10000);

Natijada obyekt yaratilganda o’z maydonlari uchun kerakli qiymatlarni oladi va boshqa obyektlar ham mana shu tarzda yaratib ketiladi.

this kalit so’zi

this kalit so’zi sinfning joriy nusxasiga havolani ifodalaydi va ushbu kalit so’z orqali sinfning maydonlari, usullari va konstruktorlarini chaqirishimiz mumkin. Bu kalit so’zni qanday holatda ishlatishimiz mumkin? Keling shuni ko’rib chiqamiz Meva sinfi orqali:

class Meva {
String nom = '';
int narx = 0;

Meva(String mevaNom, int mevaNarx) {
this.nom = mevaNom;
this.narx = mevaNarx;
}

void chiqarish()=> print('Nomi: $nom\nNarxi: $narx');
}

Hozirgi holatda konstruktor tana qismida sinf maydonlariga murojaat qilib, parametrlarni mos maydonlarga yukladik. Yana bu holat nima uchun kerak? Agarda konstruktor parametrlari sinf maydonlari nomi bilan bir xil bo’lib qolgan holatda ularni bir-biridan ajratib ko’rsatib uchun ham zarur va shundagina yuzaga keluvchi xato oldi olinadi ya’ni berilgan parametrlar qiymati maydonlarga o’zlashtirib olinmasdan qolib ketmaydi.

Endi this kalit so’zi orqali konstruktor ko’rinishini qisqartirishimiz mumkin:

class Meva {
String nom = '';
int narx = 0;

Meva(this.nom, this.narx);

void chiqarish()=> print('Nomi: $nom\nNarxi: $narx');
}

Bunda ham yaratiladigan obyekt sinf konstruktoriga murojaat etganda oldingidek, parametrlarga ketma-ket kerakli qiymatlar kiritiladi.

Konstruktor funksiyani ifodalaganligi sababli, unda har qanday funksiya singari majburiy va ixtiyoriy parametrlarni belgilashimiz mumkin:

class Meva {
String nom = '';
int narx = 0;

Meva({required this.nom, this.narx = 10000});

void chiqarish()=> print('Nomi: $nom\nNarxi: $narx');
}

void main() {
Meva meva = Meva(nom: 'anor');
meva.chiqarish();
}
>> Nomi: anor >> Narxi: 10000

Hozirda nom maydoni majburiy parametr hisoblanib konstruktorda narx esa ixtiyoriydir. Shuning uchun ham biz majburiy parametr uchun qiymat bermoqdamiz obyekt yaratayotgan vaqtda.

Nomlangan konstruktorlar

Biz sinfda faqat umumiy konstruktorni belgilashimiz mumkin. Agar sinfda bir nechta konstruktorlardan foydalanishimiz kerak bo’lsa, u holda nomlangan konstruktorlardan foydalanishimiz kerak. Buning uchun esa sinf nomiga nuqta orqali qo’shimcha identifikator (ixtiyoriy nom) yoziladi:

sinf_nomi.identifikator()

Identifikator bu konstruktor nomi vazifasini bajaradi. Meva sinfiga bir nechta nomlangan konstruktorlarni qo’shamiz:

class Meva {
String nom = '';
int narx = 0;

Meva(this.nom, this.narx);

Meva.nom(String nom) {
this.nom = nom;
this.narx = 10000;
}

Meva.narx(int narx) {
this.narx = narx;
this.nom = "Yo'q";
}

void chiqarish()=> print('Nomi: $nom\nNarxi: $narx');
}

void main() {
Meva anor = Meva('anor', 25000)
..chiqarish();

Meva olma = Meva.nom('olma')
..chiqarish();

Meva meva = Meva.narx(15000)
..chiqarish();
}
>> Nomi: anor >> Narxi: 25000 >> Nomi: olma >> Narxi: 10000 >> Nomi: Yo'q >> Narxi: 15000

Hozir kodda 2 ta nomlangan konstruktor aniqlanmoqda: Meva.nom() va Meva.narx(). Bu konstruktorlarga murojaat etishda ularning to’liq nomini ko’rsatish kerak.