— Salom, Amigo! Yangi qiziqarli mavzu.
— Bugun shunchaki qiziqarli mavzular kuni!!
— Rahmat!
— Arzimaydi.
— Shogird xotira, ChessItem bazaviy sinfini murakkab bo'lgan shaxmatchi figuralar sinfini sodda qilish uchun kiritganimizni eslaysanmi?
— Ha.
— Endi o'ylab ko'r, har bir figuraning metodi bor, u ekranda o'zini chizadi. Metodni chaqirasiz va figura o'zini chizadi hozirgi koordinatalarida. Ushbu metodni bazaviy sinfga chiqarish qulay bo'larmidi?
— Ha. Polimorfizm haqida o'rganganimdan keyin, turidan qat'i nazar har qanday figuraning chizish metodini chaqirish mumkin bo'lardi. Taxminan shunday:
class ChessBoard
{
public void drawAllChessItems()
{
//figuralarni ro'yxatga qo'shamiz
ArrayList<ChessItem> items = new ArrayList<>();
items.add(new King());
items.add(new Queen());
items.add(new Bishop());
//ularni ularning turidan qat'i nazar chizamiz.
for (ChessItem item: items)
{
item.draw();
}
}
}
— Ajoyib. Ha, shunday. ChessItem sinfining draw metodi ekranda qanday tasvir olib keladi?
— Bilmayman. Shaxmatda bunday figura yo'q. Shunga ko'ra, uning tasviri ham yo'q.
— Ha, aynan. Shuningdek, ChessItem turidagi obyektlarni yaratish ma'nosiz. Bu shaxmat figurasida emas, shunchaki abstraksiya — qulaylik uchun yaratilgan sinf. OOP'da abstraksiya shunday ishlaydi: biz muhim (hamma figuralar uchun umumiy bo'lgan) ma'lumotlar va metodlarni bazaviy sinfga chiqaramiz, ularning farqlari esa ularning sinflarida qoladi.
Java'da bunday holatlar uchun maxsus turdagi sinflar mavjud – abstrakt sinflar. Abstrakt sinflar haqida eslab qolishingiz kerak bo'lgan to'rt narsa.
1) Abstrakt sinf o'zi bilan birga metodni e'lon qilishi mumkin, lekin uning amalga oshirilishini bermasligi mumkin. Bunday metod abstrakt deyiladi.
public abstract class ChessItem
{
public int x, y; //koordinatalar
private int value; // figuraning "qiymati"
public int getValue() //oddiy metod, value ni qaytaradi
{
return value;
}
public abstract void draw(); //abstrakt metod. Amalanmagan.
}
2) Abstrakt metod maxsus abstract kalit so'zi bilan belgilanadi.
Agar sinfda birorta abstrakt metod mavjud bo'lsa, sinf ham abstract kalit so'zi bilan belgilanadi.
3) Abstrakt sinfning obyektlarini yaratib bo'lmaydi. Bunday kod shunchaki kompilyatsiya qilinmaydi.
| Java kod | Tavsif |
|---|---|
|
Bu kod kompilyatsiya qilinmaydi |
|
Bu esa mumkin. |
4) Agar sen o'z sinfingni abstrakt sinfdan meros qilib olgan bo'lsang, barcha meros qilib olingan abstrakt metodlarni qayta aniqlash kerak — ular uchun amalga oshirish yozish kerak. Aks holda, bunday sinf ham abstrakt e'lon qilinishi kerak bo'ladi. Agar sinfda birorta ham amalga oshirilmagan metod bo'lsa, u to'g'ridan-to'g'ri unda yoki ota-sinfdan meros orqali e'lon qilingan bo'lsa, u sinf abstrakt hisoblanadi.
— Bu nima uchun kerak? Nega abstrakt sinflar kerak? Oddiylar o'rniga ularni ishlata olmaymizmi? Abstrakt metodlar o'rniga shunchaki ikkita qavus yozib ketish { }?
— Mumkin. Lekin bu cheklovlar private o'rnida ko'rinadi. Biz maxsus private dan foydalanib to'g'ridan-to'g'ri ma'lumotlarga kirishni cheklaganmiz, shunda boshqa dasturchilar va ularning sinflari faqat biz yozgan public metodlardan foydalangan.
Xuddi shunday, abstrakt sinf bilan. Ushbu sinfni yozgan kishi uning ob'ektlarini yaratilishini istamaydi. Aksincha, u o'zining abstrakt sinfidan vorislik va abstrakt metodlarni qayta aniqlashga umid qiladi.
— Haligacha tushunarli emas, nega hayotni qiyinlashtirish kerak?
— Bu katta loyihalarda o'z foydasini ko'rsatadi. Sinflar qancha ko'p bo'lsa, ularning ro'lini aniqroq belgilash kerak bo'ladi. Sen buni yaqin orada ko'rasan, va bu qulaylikni yaxshi tushunib olasan. Barchamiz shu yo'ldan o'tganmiz.
GO TO FULL VERSION