PHP
July 22, 2019

Meros olish(Inheritance)

Obyektga yo'naltirilgan dasturlashda, Inheritance mavjud sinfning xususiyatlari va metodlarini ishlatishga imkon beradi.

Ko'pincha dasturlashda mavjud klassning barcha funksional imkoniyatlari va yangi metodlar mavjudligi bilan bir qatorda, mavjud holatlarda kengaytma(extension) singari yangi sinf yaratish kerak bo'lgan holatlarga duch kelamiz. Bunday hollarda biz barcha metod va xossalarini ko'chirib olishimiz va yangi sinfda mavjud sinfni yangi sinfga o'tkazish yoki yangi sinfga eski sinfni meros qilib olamiz.

Chalkahib qoldizmi? Buni tushunish uchun oddiy misolni ko'rib chiqaylik. Taassavur qiling, bizda asosiy metodlar bilan yaratilgan Human sinfi mavjud: walk(),eat(), hear() ,see().

Endi biz erkak va ayol uchun Male va Female nomli ikkita klassni yaratishimiz kerak deylik. Human sinfiga oid barcha xossa va metodlarini yaratayotgan sinflarimizda ham bo'lishi kerak. Buni biz Human sinfidan yangi sinflarga meros olish bilan qilishimiz mumkin.

Meros olingan sinf - Ota(parent) sinf(klass) deyiladi( super yoki tub(base) sinf ham deyilishi mumkin). Mos ravishda, meros olayotgan sinf esa Bola(child) sinf deyiladi(sub yoki boshlang'ich(derived) sinf deyilishi ham mumkin).

Yuqorida ko'rsatilgan namunamizda Human ota klass, Male va Female klasslar esa bola sinflar hisoblanadi.

Inheritance(Meros olish) bir qancha o'xshash sinflar yaratishimizda juda qo'l keladi. Biz umumiy metod va xossalarni ota sinfga qo'yib uni boshqa bola sinflarga meros qilib olishimiz mumkin bo'ladi, shuningdek obyektni o'chirish uchun destructor metodi ishlatiladi.


Sinfdan meros olish sintaksisi

PHP da bola(child) sinfini belgilashda ota sinfni belgilash uchun extends kalit so'z ishlatiladi. Misol uchun:

Meros olishni ishlatishda kerakli joylarni yodda tuting:

  • Bola sinf ota sinfdagi xususiy (private) bo'lmagan xossa va metodlardan foydalana oladi va kiroladi.
  • Bola sinfda, ota sinfda yo'q metodlar ham bo'lishi mumkin.
  • Bola sinf ota sinfda belgilangan metodni qayta belgilshi va u uchun o'z implementatsiyasini amalga oshirishi mumkin.

Keling, Human sinfimizga bir metod qo'shamiz va uni Male va Female bola sinflarida qanday qilib ishlatishni ko'rib chiqamiz.

Yuqoridagi kodni ko'rganingizdek, ikkala bola sinflar bosh edi, biz ularning ikkoviga ham Human sinfdan meros oldik.


Bola klass o'zining xossa va metodlari bilan

Bola sinf ota sinfni meros qilib olganda u ota sinfdagi barcha non-private(xususiy bo'lmagan) a'zolardan foydalana olish va kirishga ega bo'ladi. Bbiz buni bilamiz ammo bola sinfni o'zini xossa va metodlari bo'lishinichi? Ha, buni ham imkoni bor. Keling buni qanday qilishimizga namuna ko'ramiz:

Natija:

Mercedes benz - Engine start... 
I am Mercedes benz 
Lets go on a drive...

Agar sinf boshqa sinfni meros qilib olsa, ota sinfida belgilangan xossa va metodlarni ularni qayta belgilamasdan turib foydalanish imkoniyatiga ega bo'ladi va boshqa har qanday oddiy sinf singari, o'z xossa va metodlariga ega bo'lishi mumkin.


protected kirish modifikatori

Biz turli xil kirish modifikatorlari haqida o'rgandik va ularni har xil klassning xossa va metodlariga kirishni nazorat qilishni bilib oldik.

Agar bola sinfi ota sinfni meros qilib olsa, u faqat xususiy bo'lmagan xossalar va metodlardan qayta foydalanishi va ularga kirishi mumkin.

Ammo biz xossalar uchun public kirish modifikatorlaridan foydalanmasligimiz kerak, chunki bu xossalarga sinfdan tashqarida ham kirish mumkin.

Ota sinfining xossalari va metodlariga faqat bola sinfiga kirishga ruxsat berish uchun biz protected kirish modifikatoridan foydalanishimiz mumkin.

Agar biz sinfning har qanday xossa yoki metodini protected deb belgilab olsak, u xossalar va metodlarga faqat sinfni meros qilib oladigan bola sinfida kirish mumkin bo'ladi.

Misol uchun:

Yuqoridagi kodda name o'zgaruvchisini protected deb oldik va uni ishga tushirib ko'rdik, so'ngra ushbu xatolikni olamiz:

Fatal error: Uncaught Error: Cannot access protected property Car::$name in...

Ota sinf metodini qayta belgilash

Agar bola sinfda, ota sinfning metodini ishlatishni xohlasak ammo sal boshqacharoq bo'lsa nima bo'ladi? Bu ota sinfda belgilangan metodni qayta belgilash orqali amalga oshiriladi. Bu - Metodni qayta belgilash(Method Overriding) nomi bilan tanilgan.

Natija:

Car class drive method... 
Motorcycle class drive method...

Yuqoridagi kodda bizda "Vehicle" deb nomlangan ota klassi va ikkita "Car" va "Motorcycle" deb nomlangan bola sinflar mavjud.

Ota sinfida drive() metodi mavjud, uni bola sinflar qayta belgilagan va boshqacha ta'rif yozilgan.

Agar siz har qanday sinf ota sinfidagi metodni qayta belgilay olishini xohlamasangiz nima bo'ladi? Bunda ota sinfda final metodini belgilashimiz kerak bo'ladi. Bu metod ota klassdagi metodni qayta belgilashni bekor qiladi.

Natija:

Fatal error: Cannot override final method Vehicle::drive()