Meros olish

All lectures for UZ purposes
Daraja, Dars
Mavjud

1. Pegas

Kelinglar, OOPning uchinchi printsipi — meros olishni chuqurroq o'rganaylik. Bu juda qiziqarli mavzu va siz uni tez-tez ishlatasiz. Dasturlash, bilmaganlar uchun, sehirdan farqli emas. Shu sababdan qiziqarli analogiya bilan boshlaymiz...;

Aytaylik, siz sehrgarsiz va uchadigan ot yaratmoqchisiz. Bir tomondan, pegas yaratishga harakat qilishingiz mumkin edi. Lekin tabiatda pegaslar mavjud emas, shuning uchun bu juda qiyin bo'ladi. Ko'p narsani o'zingiz qilishingiz kerak bo'ladi. Ko'proq osonroq yo'l sifatida siz otni olib, unga qanot qo'shishingiz mumkin edi.

Meros olish. OOP

Dasturlashda bu jarayon "meros olish" deb ataladi. Aytaylik, siz juda murakkab klass yozmoqchisiz. Noldan yozish uzoq vaqt oladi, keyin hamma narsani sinash va xatolarni topish uzoq davom etadi. Eng qiyin yo'ldan borish shart emas, to'g'rimi? Balki biror joyda allaqachon mavjud bo'lgan klassni topib olish mumkinmi?

Aytaylik, siz kerakli funksionallikning 80%ini qamrab olgan bir klass topdingiz. Endi u bilan nima qilish kerak? Siz shunchaki uning kodini o'z classingizga nusxalashingiz mumkin. Lekin bunday qarorga bir nechta minuslar bor:

  1. Topilgan klass allaqachon bayt-kodga kompilyatsiya qilingan bo'lishi mumkin, va sizda uning dastlabki kodiga kirish imkoniyati yo'q.
  2. Dastlabki kod mavjud, lekin siz ishlayotgan kompaniyani boshqa birovning kodini ikki milliard dollarda ishlatgani uchun sud qilishlari mumkin.
  3. Katta hajmdagi kodning ortiqcha takrorlanishi. Bundan tashqari, agar boshqa klassning muallifi unda xato topib uni tuzatadigan bo'lsa, sizda bu xato qoladi.

Boshqa bir kichchincha yechim bor, va bu original klassning kodiga huquqiy kirish olishga ehtiyoj yo'q. Java'da siz shunchaki o'sha classni o'z classingizning ota-klass deb e'lon qilishingiz mumkin. Bu o'sha klassning kodini o'z kodiga qo'shganingizga ekvivalent bo'ladi. Sizning classingizda ota-classning barcha maʻlumotlari va barcha metodlari paydo bo'ladi. Masalan, otga meros qilib qanot qo'shing – pegasni oling.

Meros olish. OOP


2. Umumiy baza klassi

Meros olish boshqa maqsadlar uchun ham ishlatilishi mumkin. Masalan, sizda o'xshash, bir xil ma'lumotlar va metodlarga ega bo'lgan o'n class mavjud. Siz maxsus baza klassni yaratib, o'sha ma'lumotlarni (va ular bilan ishlaydigan metodlarni) bu baza klassga chiqarib, o'sha o'n classni uning merosxo'rlari deb e'lon qilishingiz mumkin. Ya'ni har bir classda, u ota-classi — bu baza class mavjud deb ko'rsatishingiz mumkin.

Abstraktsiyaning afzalliklari faqat inkapsulyatsiya bilan birgalikda ochiladi, xuddi shuningdek, meros olishning afzalliklari polimorfizmni qo'llashda juda kuchli bo'ladi. Ammo bu haqida sal keyinroq ma'lumot olasiz. Hozir esa meros olishning bir necha misollarini ko'rib chiqamiz.

Shaxmat donalari

Biz, foydalanuvchi bilan shaxmat o'ynaydigan dastur yaratayotganimizni tasavvur qiling, demak, bizga shaxmat donalari classlari kerak bo'ladi. Bu qanday classlar bo'lishi mumkin edi?

Agar siz hech qachon shaxmat o'ynagan bo'lsangiz, uning javobi aniq – Shoh, Ferz, Fil, Ot, To'p va Piyoda.

Lekin classlarda yana har bir donalar haqidagi ma'lumotlarni saqlash kerak bo'ladi. Masalan, x va y koordinatalari, shuningdek, dona qiymati. Axir ba'zi donalar boshqalarga qaraganda qimmatroq.

Bundan tashqari, donalar turlicha yuradi, ya'ni classlarning harakati ham farq qiladi. Bu qanday qilib class sifatida tavsiflanishi mumkin edi:

class King
{
   int x;
 int y;
   int worth;

   void kingMove()
   {
     // Shohning
     // qanday yurishini
     // hal qiluvchi kod
   }
}
class Queen
{
   int x;
   int y;
   int worth;

   void queenMove()
   {
     // Ferzning
     // qanday yurishini
     // hal qiluvchi kod
   }
}
class Rook
{
   int x;
   int y;
   int worth;

   void rookMove()
   {
     // To'pning
     // qanday yurishini
     // hal qiluvchi kod
   }
}
class Knight
{
   int x;
   int y;
   int worth;

   void knightMove()
   {
     // Otning
     // qanday yurishini
     // hal qiluvchi kod
   }
}
class Bishop
{
   int x;
 int y;    int worth;

   void bishopMove()
   {
     // Filning
     // qanday yurishini
     // hal qiluvchi kod
   }
}
class Pawn
{
   int x;
   int y;
   int worth;

   void pawnMove()
   {
     // Piyodaning
     // qanday yurishini
     // hal qiluvchi kod
   }
}

Bu shaxmat donalarining juda sodda tavsifi.

Umumiy baza klassi

Meros olish yordamida kodni qanday qisqartirish mumkinligining bir misoli. Biz o'xshash metodlar va ma'lumotlarni umumiy classga chiqarsak bo'ladi. Biz uni ChessItem deb ataymiz. ChessItem klassining obyektlarini yaratish ma'nosiz, chunki unga hech qanday shaxmat donasi mos emas, lekin bu juda foydali bo'lar edi:

class King extends ChessItem
{
   void kingMove()
   {
     // Shohning
     // qanday yurishini
     // hal qiluvchi kod
   }
}
class Queen extends ChessItem
{
   void queenMove()
   {
     // Ferzning
     // qanday yurishini
     // hal qiluvchi kod
   }
}
class Rook extends ChessItem
{
   void rookMove()
   {
     // To'pning
     // qanday yurishini
     // hal qiluvchi kod
   }
}
class ChessItem
{
   int x;
   int y;
   int worth;
}
class Knight extends ChessItem
{
   void knightMove()
   {
     // Otning
     // qanday yurishini
     // hal qiluvchi kod
   }
}
class Bishop extends ChessItem
{
   void bishopMove()
   {
     // Filning
     // qanday yurishini
     // hal qiluvchi kod
   }
}
class Pawn extends ChessItem
{
   void pawnMove()
   {
     // Piyodaning
     // qanday yurishini
     // hal qiluvchi kod
   }
}

Bu o'xshash obyektlar uchun kodni soddalashtirishning ajoyib usuli. Ayniqsa, loyihada minglab turli xil obyektlar va yuzlab classlar mavjud bo'lsa, biz juda ko'p afzalliklarni qo'lga kiritamiz. To'g'ri tanlangan ota (baza) classlar bilan biz nafaqat mantiqni sezilarli darajada soddalashtirishimiz, balki kodni o'n martaga qisqartirishimiz mumkin.


3. Class merosi — extends

Xo'sh, biror classdan meros olish uchun nima kerak? Bir classni boshqasidan meros qilib olish uchun, bizning class e'lonimizdan keyin extends kalit so'zini qo'yishimiz va ota-class nomini yozishimiz kerak. Bu odatda taxminan quyidagicha ko'rinadi:

class Farzand extends Ota

Aynan shunday tuzilmani Farzand classi e'lonida yozish kerak. Meros olish faqat bitta classdan mumkin, aytgancha.

Class merosi – extends

Rasmdan biz "sigir"ni "cho'chqa"dan meros qilib olinganini ko'rishimiz mumkin. "Cho'chqa" "tovuq"dan meros qilib olingan, "tovuq" esa "tuxum"dan meros qilib olingan. Faqat bitta ota! Bunday meros olish har doim ham mantiqiy emas. Lekin agar faqat cho'chqa bor bo'lsa, lekin juda kerakli sigir bo'lsa, dasturchilar ko'pincha "cho'chqa"dan "sigir" qilish istagidan tiyila olmaydi.

Java'da ko'p martalik meros olish yo'q: bir class ikki classdan meros qilib olinishi mumkin emas. Har bir classda faqat bitta ota-class bo'lishi mumkin. Agar ota-class ko'rsatilmagan bo'lsa, Object classi ota-class deb hisoblanadi.

Java'da interfeyslarning ko'p martalik meros olish mavjud. Bu muammoli vaziyatning keskinligini biroz pasaytiradi. Interfeyslar haqida biroz keyinroq gaplashamiz, hozir esa meros olish bilan davom etamiz.

P.S.

Mana sizga, muvozniyatni vaziyatini ko'p uchratadigan bir necha hikoyalar va ular nima sodir bo'ldi:


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