Dart Inkapsulyatsiya

Sinf maydonlari ommaviy ya’ni ochiqdir. Bu shuni anglatadiki, ular dasturning istalgan joyida mavjud. Va biz ushbu maydonlarning qiymatlarini erkin olishimiz yoki o'zgartirishimiz mumkin. Biroq, bunday xatti-harakatlar har doim ham istalmagan bo'lishi mumkin. Ko'pincha ichki dasturni tashqi koddan yashirish kerak, bu maydonlarni noto'g'ri ishlatish va ularga noto'g'ri qiymatlarni o'tkazishdan saqlaydi. Shu kabi qobiqga solib qo’yish, himoyalash inkapsulyatsiya deb ataladi.

Dart dasturlash tili sizga sinf maydonlarini shaxsiy qilish imkonini beradi - bunday maydonlarga faqat sinf ichida kirish mumkin. Siz sinfdan tashqarida shaxsiy maydonlarga kira olmaysiz. Maydonlarni shaxsiy qilish uchun maydon nomining oldiga pastki chiziq (_) qo'yish kerak. Biroq, bu yerda ayrim bir e’tiborli jihat mavjud. Masalan, barcha dastur kodi bitta main.dart faylida joylashgan deylik va bu kodda Daraxt sinfi aniqlangan:

class Daraxt {
String _nom = "";
int _yosh = 0;

Daraxt(String nom, int yosh) {

this._nom = nom;
this._yosh = yosh;
}

void chiqarish(){
print("Nomi: $_nom \nYoshi: $_yosh");
}
}

void main() {
Daraxt chinor = Daraxt("Chinor", 85);
chinor.chiqarish();
chinor._yosh = 100;
chinor._nom = "Archa";
chinor.chiqarish();
}
>> Nomi: Chinor >> Yoshi: 85 >> Nomi: Archa >> Yoshi: 100

Bu yerda, Daraxt sinfida mos ravishda nom va yoshni bildiruvchi _nom va _yosh maydonlari shaxsiy sifatida belgilanadi:

String _nom = "";
int _yosh = 0;

Biroq, asosiy funksiyada biz hali ham ushbu maydonlarga kirishimiz va ularning qiymatlarini o'zgartirishimiz mumkin:

chinor._yosh = 100;
chinor._nom = "Archa";

va ekranga keyingi chiqayotgan maydon qiymatlari haqiqatan ham o'zgarganligini ko'rish mumkin.

Xo'sh, maxfiylik nima? Va bu yerda, agar sinf alohida faylda aniqlangan bo'lsa, maxfiylik amal qilishini hisobga olishimiz kerak. Shunday qilib, asosiy fayl bilan bir xil papkada yangi daraxt.dart faylini yaratamiz va unda quyidagi kodni yozamiz :

class Daraxt {
String _nom = "";
int _yosh = 0;

Daraxt(String nom, int yosh) {

this._nom = nom;
this._yosh = yosh;
}

void chiqarish(){
print("Nomi: $_nom \nYoshi: $_yosh");
}
}

Xuddi shu Daraxt sinfi bu yerda aniqlanadi va main.dart asosiy faylida biz ushbu faylga murojaat qilamiz va Daraxt sinfidan foydalanamiz:

import 'daraxt.dart';
void main() {
Daraxt chinor = Daraxt("Chinor", 85);
chinor.chiqarish();
// chinor._yosh = 100;
// chinor._nom = "Archa";
chinor.chiqarish();
}

Import direktivasidan foydalanib, biz "dararxt.dart" faylini asosiy kod fayliga qo’shamiz va asosiy funksiyada Daraxt obyektini yaratamiz. Ammo endi biz _nom va _yosh maydonlariga kira olmaymiz (shuning uchun yuqoridagi misolda mos keladigan qatorlar izohlanadi). Va agar biz buni qilishga harakat qilsak, quyidagi xatoga duch kelamiz:

Shuni ta'kidlash kerakki, xuddi shu narsa xususiy usullarning ta'rifida batafsil qo'llaniladi - agar ularning nomi pastki chiziq bilan boshlansa, ular ham shaxsiydir va ularni sinfdan tashqarida chaqirib bo'lmaydi:

class Daraxt {
String _nom = "";
int _yosh = 0;

Daraxt(String nom, int yosh) {

this._nom = nom;
this._yosh = yosh;
}
void _chop_etish() => print("Nomi: $_nom \nYoshi: $_yosh");

void chiqarish() => _chop_etish();
}

Bunday holda, _chop_etish usuli shaxsiydir va joriy fayldan tashqarida murojaat etish mumkin emas.

Xususiy konstruktorlar

Nomlangan konstruktorlar shaxsiy bo'lishi ham mumkin. Masalan:

class Daraxt {
String _nom = "";
int _yosh = 0;

Daraxt(String nom, int yosh) : this._yaratish(nom, yosh);

Daraxt._yaratish(this._nom, this._yosh);

void chiqarish() => print("Nomi: $_nom \nYoshi: $_yosh");
}

Bu yerda konstruktor Daraxt._yaratish() xususiy sifatida belgilanadi - bu maqsadda konstruktor nomidan oldin pastki chiziq ham qo'yiladi. Ushbu konstruktor xususiy o'zgaruvchilarning qiymatlarini o'rnatadi:

Daraxt._yaratish(this._nom, this._yosh);

Sinf ichida biz ushbu konstruktorni chaqirishimiz mumkin.

Daraxt(String nom, int yosh) : this._yaratish(nom, yosh);

Ushbu sinf faylidan tashqarida xususiy konstruktor mavjud emas ya’ni bunda ham unga murojaat etib bo’lmaydi.