24-mavzu. Polimorfizm
Download 126.11 Kb.
|
30-maruza
24-mavzu. Polimorfizm. Polimorfizm. Virtual metodlar. Virtual xossalar. Metodlarni yashirish va qayta aniqlash. Bu so’zning ma’nosi “ko’pshakllilik”dir. Avlod sinfning vorisligidan so’ng, bazali sinfda bazali sinfning metodlari paydo bo’ladi, bu bazali metodlardan keraklilari hosilaviy sinfning talablariga ko’ra qayta ishlanishi vujudga keladi. Kllassik misol keltiramiz: “Ko’pburchak” va “Aylana”. Ikkalasi ham Object sinfining vorisi bo’lib, Draw() metodi shakllarni chizish uchun aniqlangan. Lekin birinchi holatda ko’pburchakni chizish kerak, keyin esa aylanani. Ikkila sinfda ham Draw() metodi joylashgan. Polimorfizm prinsipi Draw() metodining turlicha “to’ldirilishiga” imkoniyat beradi, metodning nomi esa o’zgarishsiz qoladi. Ya’ni bazali sinfning oldingi metodi ikkilasining avlod-ajdodida yangi ro’yxatni qabul qilish imoniyatiga ega bo’ladi (aniqrog’i, kompilyator bularning barchasini ishlatishi mumkin). Aytingchi, bu yerda shakl qani? Bu yerda til filosofiya tushunchalari bizni chalg’itadi, lekin shuni esga olamizki, “shakllantirish” so’zi grek tilida “morfi” deb talaffuz qilinadi. Bu nuqtayi nazar bilan qaraganda oldingi Draw() metodi ikkita turli avlod-ajdoddagi “shakl”ni oladi. Budan polimorfizm: ko’p shakllar. Ushbu jarayonda oldingi metodlarni yangisiga o’zgartirib tarqatuvchilar qayta aniqlanuvchi metodlar (method overidding) deb nomlanadi. Buning hisobiga kompilyator qandaydir ma’lumotlarni qayta aniqlanish imkoniyati uchun berishi kerak. Ma’lumot shunday bo’ladi: agar biz bazali sinfing ichki sinfida bir qancha metodlarning qayta aniqlanishiga ruxsat bersak, u holda bu metod virtual atributi orqali ta’minlanishi kerak. Binobarin, ma’lumoki Draw() metodi bir qancha shakllarni chizadi, taxmin qilishimiz mumkin, ona sinfda u virtual atributida joylashgan. Ushbu metodlar virtual deb ataladi. Darhaqiqat, bazali sinfda biror virtual atributli metodini joylashtirganimizda, keyinchalik qaysidir avlod-ajdod sinfning funksionalliklari bilan qayta aniqlanuvchi metod bo’lish imkoniyatini beramiz. Ya’ni metodga virtual atributini o’zlashtirganimizda, hozircha boshqa metodlar mavjud emas, boshqacha aytganda, ular mavjud bo’lmaydi, lekin haqiqatda emas, ya’ni virtual emas. Bundan tashqari metod virtual kalit so’zi orqali joylashtirilsa, ushbu metod jimlik bo’yicha bazali sinfning barcha avlodiga tarqalish imkoniyatini qabul qiladi. Agar hosila sinf qaror qilsa, ushbu metod qayta aniqlanadi, lekin uni ishlatish majburiy emas. Ushbu metodni bazali sinfdagi metoddagidek, jimlik bo’yicha oddiy chaqirish mumkin. Bazali sinfdan kompilyatorga ishora bersak (bu yerda Draw() metodi berilgan bo’ladi), u keyinchalik avlod sinfda qayta aniqlanuvchi bo’lishi mumkin. Kompilyatorga qaysi ishora, uning virtual metod bo’lishi kerakligini anglatadi? Avlodda metodga override atributini o’zlashtirishimiz kerak. Tamom. Zanjir berkitildi. Demak, “ko’pburchak” aylana sinflarida Draw() metodi override atributiga ega bo’lishi lozim. Agar biz bazali sinfning virtual metodining funksionalliklaririni o’rnatmoqchi bo’lsak, qandaydir operatorlarni yana qo’shish, oldingi metodning barcha so’zlarini yozishni istamasak, u holda base kalit so’zidan foydalanish imkoniyatimiz bor. Shunda, masalan, Draw() metodiga murojaat, uning ichki qayta aniqlanishida base.Draw() ko’rinishida bo’ladi. Qayta aniqlanuvchi metodga doir misol dasturi (8.13-listing)ni qarab chiqamiz. Dastur natijasini – 8.7-rasmda ko’rishingiz mumkin. Download 126.11 Kb. Do'stlaringiz bilan baham: |
ma'muriyatiga murojaat qiling