Dart Sinflar

Dart dasturlash tili – bu obyektga yo’naltirilgan dasturlash tili bo’lib, Dart kod faylida biz boshqaradigan har bir qiymat obyektdir.

Sinf – shablon yoki obyektning tavsifi, obyekt esa sinfning namunasini ifodalaydi. Masalan, bunga sayyoralarni olishimiz mumkin. Ular ovolsimon (to’liq shar shaklida emas) shaklda, og’irligi, yo’ldoshlari va boshqa xususiyatlari mavjud. Ularni Sayyora sinfidan olingan obyektlar deb tasvirlay olamiz. Haqiqatdan ham ular Sayyora sinfining bir namunasi hisoblanadi. Bir-biriga o’xshashligi bois.

Sinf class kalit so’zi yordamida yaratiladi:

class Sayyora {
// sinf tana bloki
}

Sayyora nomli sinf aniqlandi va jingalak qavslar uning tanasini ifodalaydi. Sinf tana bloki ichida maydonlari va funksiyalari (usullari) ni joylashtiramiz. Sinf tanasi bo’sh bo’lishiga qaramay u yangi tur hisoblanadi. Hamda biz shu turdagi yangi o’zgaruvchini yaratishimiz mumkin:

class Sayyora {}


void main() {
Sayyora yer;
}

Bu yerda yer nomli o’zgaruvchi Sayyora sinfidan olingan obyekt hisoblanadi. Sinfdan obyekt olishda o’zgaruvchi yaratishdagi kabi holat qo’llanilib, turida esa sinf nomi berib ketiladi. Yana sinf obyektini yaratishda maxsus sinf funksiyasidan foydalaniladi, u esa sinf nomi bilan chaqiriladi va konstruktor deb nomlanadi. Aks holda obyekt ishlamaydi. Sinfda konstruktor aniqlanmagan holatda bo’lsa, unda sinfda avtomatik ravishda parametrsiz konstruktor yaratiladi:

class Sayyora {}

void main() {
Sayyora yer = Sayyora();
}

Yodda tuting!

Har qanday obyekt 2 ta asosiy xususiyatiga ega bo’ladi:

  1. holat – obyekt saqlaydigan ma’lumotlar
  2. xatti-harakatlar – obyekt bajarishi mumkin bo’lgan vazifalar

Obyekt holatini sinfda saqlash uchun maydonlar yoki sinf o’zgaruvchilaridan foydalaniladi. Funksiya (metod yoki usul) lar sinfdagi obyektning harakati (vazifasi) ni aniqlash uchun ishlatiladi.

Masalan, saytlarni ifodalovchi Site sinfi quyidagi ko’rinishga ega bo’lishi mumkin:

class Site {
String name = "";
int created_at = 0;

void print_display() => print("Nomi: $name, Yaratilgan vaqti: $created_at");
}

Site sinfi 2 ta maydondan tashkil topgan. name – sayt nomini, created_at – esa sayt yaratilgan vaqtni ifodalaydi. Hamda qo’shimcha print_display nomli funksiya sinf metodi bu ma’lumotlarni ekranga ko’rsatish uchun yaratilgan.

Obyekt yaratgandan so’ng, biz obyekt nomi orqali Site sinfining maydon va metodlariga murojaat etishimiz mumkin. Buning uchun ‘.’ nuqta operatoridan foydalanamiz va maydon yoki metod nomini nuqta orqali ko’rsatamiz:

obyekt_nomi.maydon

obyekt_nomi.metod()

Masalan, Site sinfi orqali obyektlar yaratib, ulardan foydalanaylik,

class Site {
String name = "";
int created_at = 0;

void print_display() => print("Nomi: $name, Yaratilgan vaqti: $created_at");
}

void main() {
Site site = Site();
site.print_display();

Site site_one = Site();
site_one.name = "Uzbekdevs";
site_one.created_at = 2022;
site_one.print_display();
}
>> Nomi: , Yaratilgan vaqti: 0 >> Nomi: Uzbekdevs, Yaratilgan vaqti: 2022

Shunday qilib, obyekt maydonlariga kirish orqali ularning qiymatlarini olishimiz yoki o’zgartirishimiz mumkin:

site_one.name = "Uzbekdevs";
site_one.created_at = 2022;
print(site_one.name);

.. – kaskad yozuvi orqali bitta obyektda bir nechta operatsiyalar ketma-ketligini bajarishga imkon yarata olamiz. Yuqoridagi kodni shu usulda yozib ifodalasak,

class Site {
String name = "";
int created_at = 0;

void print_display() => print("Nomi: $name, Yaratilgan vaqti: $created_at");
}

void main() {
Site site_one = Site()
..name = "Uzbekdevs"
..created_at = 2022
..print_display();
}

Obyektlarni nusxalashda dartdagi o’zgaruvchilar aslida xotiradagi sinf obyektlariga havolalarni ifodalaydi. Bu shuni anglatadiki, agar bitta sinf o'zgaruvchisiga boshqa o'zgaruvchining qiymati tayinlangan bo'lsa, o'zgaruvchi aslida xotirada bir xil obyektga havola oladi. Shunday qilib, ikkita o'zgaruvchi xotiradagi bir xil obyektga murojaat qiladi. Keling, bir misolni ko'rib chiqaylik:

class Site {
String name = "";
}

void main() {
Site site_one = Site()
..name = "Uzbekdevs";

Site site_two = site_one
..name = "freecamp";
print(site_one.name);
}
>> freecamp

site_one o'zgaruvchisini site_two o'zgaruvchisiga tayinlagandan so'ng, bu o'zgaruvchilarning ikkalasi ham xotiradagi bir xil obyektga murojaat qiladi:

Site site_two = site_one;

Shunga ko'ra, agar biz site_two obyektining name maydoni qiymatini o'zgartirsak:

Site site_two = site_one
..name = "freecamp";

Keyin site_one obyektining name maydoni qiymati ham o'zgaradi, chunki site_one va site_two bir xil obyektga ishora qiladi:

print(site_one.name);

Shuning uchun, agar siz ma'lumotlarni bir obyektdan ikkinchisiga nusxalashingiz kerak bo'lsa va ikkala obyekt bir-biridan mustaqil ravishda mavjud bo'lishi va o'zgarishi uchun siz boshqa usuldan foydalanishingiz kerak, masalan, ikkita mustaqil obyektni yaratish va oddiygina qiymatlarni nusxalash. Bir obyektnikini ikkinchisiga.