Ba'zan biz o'ziga xos ta’rifga ega bo'lmagan obyektlar bilan ishlashimiz kerak. Masalan, "hayvon" larni. Muayyan turdagi hayvonlar bor - mushuk, it va boshqalar, ammo hayvonning o'ziga xos ta’rifi yo'q. Yoki "geometrik shakl" ning mohiyati. To'rtburchak, kvadrat, doira, uchburchak mavjud, ammo geometrik shaklning o'zi ham o'ziga xos ta’rifga ega emas. Va odatda mavhum sinflar bunday obyektlarni tasvirlash uchun ishlatiladi.
Abstrakt sinflar abstract kalit so'zi yordamida aniqlanadi. Masalan, geometrik shaklning mavhum sinfini aniqlaymiz:
abstract class Shakl {}
Abstrakt sinflar oddiy sinflarga o'xshaydi (maydonlarni, usullarni, konstruktorlarni ham belgilanishi mumkin), faqat biz uning konstruktori yordamida abstrakt sinf obyektini bevosita yarata olmaymiz. Agar yaratishga uringan vaqtimizda man shu kabi xato xabarini olamiz:
abstract class Shakl {}
void main() {
Shakl uchburchak = Shakl();
}
Shakl uchburchak = Shakl();
Qoida tariqasida, mavhum sinflar voris sinflari tomonidan o'ziga xos tarzda amalga oshiriladigan ba'zi umumiy funksiyalarni e'lon qiladi. Masalan, geometrik shakllar sinfida perimetr, yuza va boshqalarni hisoblash usullari bo'lishi mumkin.
abstract class Shakl {
void yuzani_hisoblash(){
print("Mavjud emas.");
}
}
class Tortburchak extends Shakl {
int boyi;
int eni;
Tortburchak(this.boyi, this.eni);
@override
void yuzani_hisoblash(){
int yuza = boyi * eni;
print("Yuzi: $yuza");
}
}
void main (){
Shakl tort = Tortburchak(20, 30);
tort.yuzani_hisoblash();
}
Bu yerda mavhum geometrik Shakl sinfi yuzani_hisoblash() shakl maydonini ekranga chop etish usulini belgilaydi. Tortburchak klassi ushbu usul uchun uning bajarilishini belgilaydi.
Abstrakt usullar
Yuqoridagi misolda Shakl tayanch sinfidagi yuzani_hisoblash() usuli hech qanday foydali ish bajarmaydi, chunki mavhum shakl maydonga ega bo‘la olmaydi va bu holda, bunday usulni mavhum sifatida belgilash yaxshiroqdir:
abstract class Shakl {
void yuzani_hisoblash();
}
class Tortburchak extends Shakl {
int boyi;
int eni;
Tortburchak(this.boyi, this.eni);
@override
void yuzani_hisoblash(){
int yuza = boyi * eni;
print("Yuzi: $yuza");
}
}
void main (){
Shakl tort = Tortburchak(20, 30);
tort.yuzani_hisoblash();
}
Abstrakt usul oddiy usul bilan bir xil tarzda aniqlanadi, lekin usul tanasi o'rniga parametrlar ro'yxatidan keyin nuqta-vergul qo'yiladi: void yuzani_hisoblash();.
Shuni ta'kidlash kerakki, mavhum usullarni faqat mavhum sinflarda aniqlash mumkin. Bundan tashqari, agar asosiy sinf mavhum usulni aniqlasa, u holda voris sinf uni amalga oshirishi kerak, ya'ni usulning tanasini aniqlaydi.