JavaRush /Kurslar /All lectures for UZ purposes /Meros olish. Meros olishning afzalliklari

Meros olish. Meros olishning afzalliklari

All lectures for UZ purposes
Daraja, Dars
Mavjud

— Salom, Amigo! Hozir bir mavzu bo'ladi, o'ylaymanki, bu narsani tez-tez ishlatib turasan. Bu — meros olish.

Dasturlash, bilmaganlar uchun, magiyadan farq qilmaydi. Shuning uchun qiziqarli bir o'xshashlikdan boshlayman…

Faraz qilaylik, sen sehrgarsan va uchuvchi ot yaratmoqchisan. Bir tomondan, sen pegas yaratishga harakat qilishing mumkin. Ammo tabiiy pegaslar mavjud emasligi sababli, bu juda qiyin bo'ladi. Har narsani o'zing qilishing kerak bo'ladi. Eng oddiy yo'li — bir ota olib, unga qanotlar qoshish.

Meros olish. Meros olishning afzalliklari - 1

Dasturlashda bu jarayon «meros olish» deb ataladi. Faraz qilaylik, senga juda murakkab bir class yozish kerak. Boshidan yozish uzoq vaqt oladi, keyin yana uzoq vaqt barcha narsalarni sinash va xatolarni topish kerak bo'ladi. Nega eng qiyin yo'lni bosib o'tish kerak? Yaxshisi, shu classning tayyorini izlash kerak emasmi?

Faraz qilaylik, sen topgan class, sening kerakli funksionalligingning 80% ini amalga oshiradi. Sen shunchaki uning kodini o'z classingga ko'chirishing mumkin. Lekin bu yechimning bir nechta kamchiliklari bor:

1) Topilgan class allaqachon byte-codega kompilyatsiya qilingan bo'lishi mumkin va sen uning manba kodiga kirish imkoning yo'q.

2) Classning manba kodi bor, lekin sen bir kompaniyada ishlayapsan, va ular hatto 6 qatordan ortiq bo'lgan koddan foydalanganlik uchun sudga berilishi mumkin. Keyin esa ular seni sudga berishadi.

3) Katta hajmdagi kodning keraksiz dublikatlash. Bundan tashqari, agar boshqa class muallifi xatoni topib uni to'g'rilasa, sening kodda bu xato qoladi.

Haqiqatan ham ingichka yechim bor, va original classning kodiga huquqiy kirish imkoniga ehtiyoj yo'q. Java'da sen faqat ushbu classni o'z classingning ota classi deb e'lon qilishing mumkin. Bu, go'yo, sen ushbu classning kodini o'z kodiga qo'shgansan kabi bo'ladi. Sening classingda ota classning barcha ma'lumotlari va barcha metodlari paydo bo'ladi. Masalan, buni shunday qilsak bo'ladi: «otdan» meros olamiz, «qanotlar»ni qo'shamiz — «pegas»ni olamiz

Meros olish. Meros olishning afzalliklari - 2

— Juda qiziqarli, davom et.

— Meros olishni boshqa maqsadlar uchun ham ishlatish mumkin. Misol uchun, sening o'xshash, bir xil ma'lumotlarga va metodlarga ega bo'lgan o'n classing bor. Sen maxsus bir asosiy class yaratib, ushbu ma'lumotlarni (va ular bilan ishlaydigan metodlarni) ushbu asosiy classga olib kirib, ushbu o'n classni uning merosxo'rlari deb e'lon qilishing mumkin. Bu esa har bir classda, ularning ota classi - bu asosiy class ekanligini ko'rsatish kerak.

Aynan qanday abstraktsiyaning afzalliklari inkapsulyatsiya bilan qo'llanilganda ochiladi, shunday qilib, meros olishning afzalliklari ham polimorfizm bilan ishlatilganda kuchliroq bo'ladi. Lekin bu haqida ertaga aytib beraman. Bugun esa, meros olishning bir necha misollarini ko'rib chiqamiz.

Faraz qilaylik, biz foydalanuvchi bilan shaxmat o'ynaydigan dastur yozamiz, unda figuralar uchun classlar kerak bo'ladi. Amigo, qaysi classlarni taklif qilarding?

— Qirol, Ferz, Fil, Ot, Kalit va Piyoda.

— Zo'r. Hech narsani o'tkazib yubormading.

— Va ushbu classlarda qanday ma'lumotlarni saqlashni taklif qilarding?

— X va y koordinatalari, shuningdek, uning qiymati (worth). Chunki ba'zi figuralar boshqalarga qaraganda qimmatroqdir.

— Ushbu classlarning farqlari nimada?

— Farqlar figuralarning qanday harakat qilishidadir. Ularning harakatida.

— Ha. Ularni classlar sifatida quyidagi tarzda tasviflashimiz mumkin edi:

class King
{
int x;
int y;
int worth;
void kingMove()
{
// Qirol qanday harakat qilishini belgilaydigan kod
}
}
class Queen
{
int x;
int y;
int worth;
void queenMove()
{
// Ferz qanday harakat qilishini belgilaydigan kod
}
}
class Rook
{
int x;
int y;
int worth;
void rookMove()
{
// Kalit qanday harakat qilishini belgilaydigan kod
}
}
class Knight
{
int x;
int y;
int worth;
void knightMove()
{
// Ot qanday harakat qilishini belgilaydigan kod
}
}
class Bishop
{
int x;
int y;
int worth;
void bishopMove()
{
// Fil qanday harakat qilishini belgilaydigan kod
}
}
class Pawn
{
int x;
int y;
int worth;
void pawnMove()
{
// Piyoda qanday harakat qilishini belgilaydigan kod
}
}

— Ha, men ham shunday yozardim.

— Meros olish yordamida kodni qanday qisqartirish mumkinligini ko'rib chiqamiz. Biz bir xil metodlar va ma'lumotlarni umumiy classga o'tkazishimiz mumkin edi. Uni ChessItem deb ataymiz. ChessItem classining ob'ektlarini yaratish mantiqsiz, chunki unga hech qaysi shaxmat figuralari mos kelmaydi, lekin undan ko'p foyda bo'lardi:

class King extends ChessItem
{
void kingMove()
{
// Qirol qanday harakat qilishini belgilaydigan kod
}
}
class Queen extends ChessItem
{
void queenMove()
{
// Ferz qanday harakat qilishini belgilaydigan kod
}
}
class Rook extends ChessItem
{
void rookMove()
{
// Kalit qanday harakat qilishini belgilaydigan kod
}
}
 class ChessItem
{
int x;
int y;
int worth;
}
 
class Knight extends ChessItem
{
void knightMove()
{
// Ot qanday harakat qilishini belgilaydigan kod
}
}
class Bishop extends ChessItem
{
void bishopMove()
{
// Fil qanday harakat qilishini belgilaydigan kod
}
}
class Pawn extends ChessItem
{
void pawnMove()
{
// Piyoda qanday harakat qilishini belgilaydigan kod
}
}

— Qanchalik qiziqarli.

— Aynan shunday! Ayniqsa, minglab har xil ob'ektlar va yuzlab classlar bo'lgan loyihalarda ko'p afzalliklar olamiz. To'g'ri tanlangan classlar yordamida nafaqat mantiqni sezilarli darajada soddalashtirish, balki kodni o'nlab marta qisqartirish mumkin.

— Biror classni meros olish uchun nima kerak?

— Buning uchun class e'lon qilinganidan keyin extends kalit so'zini yozish va ota classning nomini yozish kerak. Faqatgina bitta classdan meros olish mumkin.

Meros olish. Meros olishning afzalliklari - 3

Rasmda biz «sigir» ko'rib turibmiz, u «cho'chqa»dan meros olgan. «Cho'chqa» esa «tovuq»dan, «tovuq» esa «tuxum»dan meros olgan. Faqat bitta ota! Bunday meros har doim mantiqiy emas. Lekin agar faqat cho'chqa bo'lsa, lekin tilayapmiz sigir bor bo'lishi, ko'pincha dasturchi cho'chqadan sigir qilish istagiga qarshi turolmaydi.

— Menga ikki classdan meros olish istagi tug'ilsa nima qilish mumkin?

— Deyarli hech narsa. Java'da classlarning ko'p marta meros olishi yo'q: class faqat bitta ota classga ega bo'lishi mumkin. Lekin interfeyslarning ko'p marta meros olish mavjud. Bu muammoni biroz yumshatadi.

— Tushunarli. Interfeys nima o'zi?

— Interfeyslar haqida ertaga aytib beraman, hozir esa meros olishni davom ettiramiz.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION