logo

VIRTUAL METODLAR VA POLIFORMIZM. SOF VIRTUAL METODLAR VA ABSTAKSIYA

Загружено в:

11.11.2024

Скачано:

0

Размер:

906.751953125 KB
MAVZU:  VIRTUAL METODLAR VA POLIFORMIZM. SOF VIRTUAL
METODLAR VA ABSTAKSIYA
REJA:
a)Kirish.
b)Nazariy qism.
1. Virtual metodlar haqida tushuncha.
2. Poliformizm haqida tushuncha.
3. Sof virtual metodlar va abstraksiya.
c)Xulosa KIRISH
Virtual   funktsiya   (shuningdek,   virtual   usullar   sifatida   ham   tanilgan)   asosiy
sinf   ichida   e'lon   qilingan   va   olingan   sinf   tomonidan   qayta   belgilangan   (bekor
qilingan)   a'zo   funksiyadir.   Ko'rsatgich   yoki   asosiy   sinfga   havola   yordamida
olingan   sinf   ob'ektiga   murojaat   qilganingizda,   ushbu   ob'ekt   uchun   virtual
funktsiyani   chaqirishingiz   va   olingan   sinfning   usul   versiyasini   bajarishingiz
mumkin.
 Virtual funksiyalar funksiya chaqiruvi uchun foydalaniladigan havola (yoki
ko‘rsatkich) turidan qat’i nazar, ob’ekt uchun to‘g‘ri funksiya chaqirilishini 
ta’minlaydi.
 Ular asosan runtime poliformizmga   erishish uchun ishlatiladi   .
 Funktsiyalar asosiy sinfda   virtual   kalit so'z bilan e'lon qilinadi .
 Funktsiya chaqiruvini hal qilish ish vaqtida amalga oshiriladi.
Virtual   metodlar   -   bu   avlod   sinflarda   qayta   belgilanishi   kutilayotgan   a'zo
funksiya.   Ko'rsatkich   yoki   asosiy   sinfga   havola   yordamida   olingan   sinf   ob'ektiga
murojaat   qilganingizda,   ushbu   ob'ekt   uchun   virtual   funktsiyani   chaqirishingiz   va
olingan sinfning funksiya versiyasini bajarishingiz mumkin.
Virtual   metodlar   metodni   chaqirishda   foydalanilgan   ifodadan   qat'iy   nazar,
ob'ekt uchun to'g'ri metod chaqirilishini ta'minlaydi.
Virtual funksiyalar uchun qoidalar
C++ da virtual funksiyalar uchun qoidalar quyidagicha:
1. Virtual funktsiyalar statik bo'lishi mumkin emas.
2. Virtual funktsiya boshqa sinfning do'st funktsiyasi bo'lishi mumkin.
3. Virtual   funktsiyalarga   ish   vaqti   polimorfizmiga   erishish   uchun
ko'rsatgich yoki asosiy sinf turiga mos yozuvlar yordamida kirish kerak.
4. Virtual funktsiyalarning prototipi asosda ham, olingan sinfda ham bir
xil bo'lishi kerak. 5. Ular   har   doim   asosiy   sinfda   aniqlanadi   va   olingan   sinfda   bekor
qilinadi.   Olingan   sinfni   bekor   qilish   (yoki   virtual   funktsiyani   qayta   belgilash)
majburiy emas, bu holda funktsiyaning asosiy sinf versiyasidan foydalaniladi.
6. Sinfda   virtual   destructor   bo'lishi   mumkin   ,   lekin   unda   virtual
konstruktor bo'lishi mumkin emas.
Virtual funksiyalarning cheklovlari
 Sekinroq:   Funktsiya   chaqiruvi   virtual   mexanizm   tufayli   biroz   ko'proq
vaqt   oladi   va   kompilyatorni   optimallashtirishni   qiyinlashtiradi,   chunki
kompilyatsiya vaqtida qaysi funktsiya chaqirilishini aniq bilmaydi.
 Nosozliklarni   tuzatish   qiyin:   murakkab   tizimda   virtual   funksiyalar
funksiya   qayerdan   chaqirilayotganini   aniqlashni   biroz   qiyinlashtirishi
mumkin.
 Hech   qachon   CONSTRUCTOR   yoki   DESTRUCTORdan   virtual
funktsiyani chaqirmang
NAZARIY QISM
B ir misolni ko rib chiqaylikʻ .
Aslida child obyekti Parent sinfiga havola bo lsa ham, rParent Parent sinfiga	
ʻ
havola bo lgani uchun Parent::getName() chaqiriladi.	
ʻ
 Quyida virtual metodlardan foydalangan holda ushbu muammoni qanday hal
qilishni   ko rib   chiqamiz.   C++   tilidagi   virtual   metod   funksiyaning   maxsus   turi
ʻ
bo lib, chaqirilganda ajdod va avlod sinflari o rtasida mavjud bo lgan “eng katta”	
ʻ ʻ ʻ
avlod   metodi   bajariladi.   Bu   xususiyat   polimorfizm   deb   ham   ataladi.   Funksiya
imzosi   (nom,   parametr   turlari   va   metod)   va   avlod   metodining   qaytish   turi   ajdod-
sinfning   metodining   imzosi   va   qaytish   turiga   mos   kelganda,   avlod   metodi chaqiriladi. Bu metodlarni qayta aniqlash deyiladi. Funksiyani virtual qilish uchun
funksiya e’lonidan oldin  virtual  kalit so zini ko rsatish kifoya.ʻ ʻ
- Birinchidan, C sinfining c obyekti yaratiladi; 
- rParent A sinfining havolasi bo lib, biz uni c obyektning A qismiga murojaat	
ʻ
qilish uchun belgilaymiz; 
- Keyin Parent.getName() metodi chaqiriladi. 
Parent.getName() metodiga murojaat qilish A::getName() metodiga murojaat
qilishga   olib   keladi.   Biroq,   A::getName()   virtual   funksiya   bo lganligi   sababli,	
ʻ
kompilyator  A  va   C   o rtasida   "eng   katta"   avlodning   metodini   qidiradi.   Bu   holda,	
ʻ
“eng   katta”   metod   C::getName()   hisoblanadi.   E'tibor   bering,   kompilyator
D::getName() metodiga murojaat qilmaydi, chunki bizning asl obyektimiz D sinfi
emas, C sinfi edi, shuning uchun faqat A va C sinflari orasidagi metodlar hisobga
olinadi.   Dasturni bajarish natijasi: rParent: C
Yanada   murakkabroq   misolni   ko rib   chiqamiz.   Animal   sinfini   ko rib	
ʻ ʻ
chiqamiz.  
Xuddi shu sinfni speak() metodini virtual qilish orqali ko rib chiqaylikʻ Dastur muvaffaqiyatli natija berganini ko rishimiz mumkin.ʻ
 Animal.speak() metodini qayta ishlashda kompilyator Animal::speak() virtual
funksiya   ekanligini   ko radi.   Animal   Cat   obyektining   Animal   qismiga   murojaat	
ʻ
qilganda,   kompilyator   eng   katta   avlod   speak()   metodini   topish   uchun  Animal   va
Cat o rtasidagi barcha sinflardan o tadi va u Cat::speak() metodini topadi. Animal	
ʻ ʻ
Dog   obyektining   Animal   qismiga   murojaat   qilganda,   kompilyator   Dog::speak()
metodini   topadi.   Animal::getName()   metodi   virtual   funksiyaga   aylantirilmagan.
Buning   sababi,   getName()   hech   qachon   avlod   sinflarida   qayta   aniqlanmaydi,
shuning uchun bu majburiy emas.
Eslatma:   Avlod   sinfining   virtual   metodi   sarlavhasi   ajdod-sinfning   virtual
metodi sarlavhasiga to liq mos kelishi kerak. Agar avlod metodi ajdoddan boshqa	
ʻ
turdagi parametrlarga ega bo lsa, bu metod chaqirilmaydi.	
ʻ
Virtual  metodlarning  turlarini  qaytarish. Virtual   metodning qaytish  turlari   va
uning qayta aniqlanishi mos kelishi kerak.  Quyidaga  misolni ko rib chiqamiz.	
ʻ Bu   holda   Child::getValue()   Parent::getValue()   uchun   mos   qayta   aniqlanish
sanalmaydi,   chunki   qaytarish   turlari   har   xil   (Child::getValue()   metodi   butunlay
alohida funksiya hisoblanadi). Konstruktorlar yoki destruktorlar tanasidagi  virtual
funksiyalarni   chaqirmaslik   tavsiya   etiladi.   Child   sinfining   obyektini
yaratganingizda,   avval   ushbu   obyektning   ajdodi,   keyin   esa   avlodi   yaratilishini
unutmaslik   lozim.   Agar   virtual   funksiyani   Parent   sinfi   konstruktoridan
chaqirsangiz ham, yaratilgan obyektning quyi qismi hali yaratilmagan bo lsa ham,ʻ
u   holda   ajdod   o rniga   avlod   metodini   chaqirib   bo lmaydi,   chunki   avlod   obyekt	
ʻ ʻ
ishlash uchun Child sinf metodi bilan hali yaratilmagan. Bunday hollarda usulning
asosiy   varianti   C++   da   chaqiriladi.   Xuddi   shunday   muammo   destruktorlar   bilan
ham   mavjud.   Agar   siz   virtual   metodni   ajdod-sinf   destruktorining   tanasida
chaqirsangiz,   u   holda   Parent   sinfning   metodi   har   doim   chaqiriladi,   chunki
obyektning quyi qismi allaqachon yo q qilinadi.	
ʻ
C++   sof   virtual   metodlar   (yoki   “abstrakt(mavhum)   funksiyalar”)   deb
ataladigan   maxsus   turdagi   virtual   metodlarni   yaratishga   imkon   beradi.   Ularda
umuman ta’rif yo q. Ular avlod sinflari tomonidan qayta aniqlanadi. 	
ʻ
Sof   virtual   funksiyani   yaratishda   virtual   metodni   aniqlash   (tanasini   yozish)
o rniga, shunchaki 0 qiymatini beramiz.	
ʻ Sof virtual funksiyadan foydalanish ikkita asosiy ta’sirga ega. Birinchidan, bir
yoki bir nechta sof virtual funksiyalarga ega bo lgan har qanday sinf obyektlariniʻ
yaratib bo lmaydigan abstrakt sinfga aylanadi.	
ʻ
Ikkinchidan,  mavhum  ajdod-sinfning barcha avlod sinflari  barcha sof  virtual
funksiyalarni   qayta   aniqlashi   kerak,   aks   holda   ular   ham   abstrakt   sinflar
hisoblanadi.
Sof virtual funksiyaga misol ko rib chiqamiz.	
ʻ
speak()   metodini   qayta   aniqlash   unutildi,   shuning   uchun   lion.speak()
Animal.speak() deb nomlandi va yuqoridagi natijani oldik.
Bu holda yechim sof virtual funksiyadan foydalanishdir. Birinchidan,   speak()   endi   sof   virtual   funksiyadir.   Bu   shuni   anglatadiki,
Animal endi abstrakt ajdod-sinf bo lib, protected spetsifikatsiyaga muhtoj emasmizʻ
(garchi   bu   ortiqcha   bo lmasa   ham).   Ikkinchidan,   Lion   sinfi  Animal   sinfi   avlodi	
ʻ
bo lganligi   sababli,   lekin   Lion::speak()   metodini   aniqlamagani   uchun,   Lion   ham	
ʻ
abstrakt   sinf   hisoblanadi.   Shuning   uchun,   quyidagi   kodni   kompilyatsiya   qilishga
harakat qilib ko raylik	
ʻ . Keyin   Lion   abstrakt   sinf   ekanligini   va   abstrakt   sinf   obyektlarini   yaratish
mumkin   emasligini   bildiruvchi   xatoga   duch   kelamiz.   Bundan   xulosa   qilish
mumkinki,   Lion   sinfining   obyektini   yaratish   uchun   speak()   metodini   qayta
aniqlashimiz kerak.
Sof virtual funksiya ajdod sinfiga qo ymoqchi bo lgan funksiyaga ega bo lsakʻ ʻ ʻ
foydali bo ladi, lekin realizatsiyani avlod sinflariga qoldirish lozim. Abstrakt ajdod	
ʻ
sinfning   sof   virtual   funksiyasi   avlod   sinflarini   ushbu   funksiyani   qayta   aniqlashga
majbur qiladi, aks holda bu sinflarning obyektlarini yaratish mumkin bo lmaydi.	
ʻ
Xulosa
Virtual   metodlar   metodni   chaqirishda   foydalanilgan   ifodadan   qat'iy   nazar,
ob'ekt uchun to'g'ri metod chaqirilishini ta'minlaydi.
C++   tilidagi   virtual   metod   funksiyaning   maxsus   turi   bo lib,   chaqirilganda	
ʻ
ajdod   va   avlod   sinflari   o rtasida   mavjud   bo lgan   “eng   katta”   avlod   metodi	
ʻ ʻ
bajariladi. Bu xususiyat polimorfizm deb ham ataladi. Sof virtual funksiyadan foydalanish ikkita asosiy ta’sirga ega. Birinchidan, bir
yoki bir nechta sof virtual funksiyalarga ega bo lgan har qanday sinf obyektlariniʻ
yaratib bo lmaydigan abstrakt sinfga aylanadi.	
ʻ
Ikkinchidan,  mavhum  ajdod-sinfning barcha avlod sinflari  barcha sof  virtual
funksiyalarni   qayta   aniqlashi   kerak,   aks   holda   ular   ham   abstrakt   sinflar
hisoblanadi.
Foydalanilgan adabiyotlar ro yxati	
ʻ
1.  Клейнберг   Дж .,  Тардос   Е .  К 48  Алгоритмы :  разработка   и     применение .
Классика  Computers Science /  Пер .  с   англ .  Е .   Матвеева . —  СПб .:  Питер , 2016.
— 800  с .:  ил . — ( Серия   « Классика  computer science»). 
2.   To‘rayev   H.T.   Matematik   mantiq   va   diskret   matematika.:   Oliy   ta’lim
muassasalarining   talabalari   uchun   darslik:   11   jildlik.   H.T.     To‘rayev,   1.  Azizov;
H.T.   To'rayevning   umumiy   tahriri   ostida;     O‘zR   Oliy   va   o‘rta-maxsus   ta’lim
vazirligi. - Toshkent:  Tafakkur-Bo‘stoni, 2011. - 288 bet 
3. Ахо, Альфред, В., Хопкрофт, Джон, Ульман, Джеффри, Д.  Структуры
данных   и   алгоритмы.:   Пер.   с   англ.:   Уч.   Пос.   –   М.     Издательский   дом
«Вильямс», 2000. – 384 с.: ил. – Парал.  Титю англ.  
4. Пышкин Е.В. Структуры данных и алгоритмы: реализация   на   C / C ++.
- СПб.: ФТК СПБГПУ, 2009.- 200 с., ил. 
5.   Овсянников,   А.   В.   Алгоритмы   и   структуры   данных   :   учебно-
методический   комплекс   для   специальности   1-31   03   07     «Прикладная
информатика (по направлениям)». Ч. 1 / А. В.  
6.   Домнин   Л.   Н.   Элементы   теории   графов:   учеб.   Пособие   /   Л.     Н.
Домнин. – Пенза: Изд-во Пенз. Гос. Ун-та, 2007. – 144 с.

MAVZU: VIRTUAL METODLAR VA POLIFORMIZM. SOF VIRTUAL METODLAR VA ABSTAKSIYA REJA: a)Kirish. b)Nazariy qism. 1. Virtual metodlar haqida tushuncha. 2. Poliformizm haqida tushuncha. 3. Sof virtual metodlar va abstraksiya. c)Xulosa

KIRISH Virtual funktsiya (shuningdek, virtual usullar sifatida ham tanilgan) asosiy sinf ichida e'lon qilingan va olingan sinf tomonidan qayta belgilangan (bekor qilingan) a'zo funksiyadir. Ko'rsatgich yoki asosiy sinfga havola yordamida olingan sinf ob'ektiga murojaat qilganingizda, ushbu ob'ekt uchun virtual funktsiyani chaqirishingiz va olingan sinfning usul versiyasini bajarishingiz mumkin.  Virtual funksiyalar funksiya chaqiruvi uchun foydalaniladigan havola (yoki ko‘rsatkich) turidan qat’i nazar, ob’ekt uchun to‘g‘ri funksiya chaqirilishini ta’minlaydi.  Ular asosan runtime poliformizmga erishish uchun ishlatiladi .  Funktsiyalar asosiy sinfda virtual kalit so'z bilan e'lon qilinadi .  Funktsiya chaqiruvini hal qilish ish vaqtida amalga oshiriladi. Virtual metodlar - bu avlod sinflarda qayta belgilanishi kutilayotgan a'zo funksiya. Ko'rsatkich yoki asosiy sinfga havola yordamida olingan sinf ob'ektiga murojaat qilganingizda, ushbu ob'ekt uchun virtual funktsiyani chaqirishingiz va olingan sinfning funksiya versiyasini bajarishingiz mumkin. Virtual metodlar metodni chaqirishda foydalanilgan ifodadan qat'iy nazar, ob'ekt uchun to'g'ri metod chaqirilishini ta'minlaydi. Virtual funksiyalar uchun qoidalar C++ da virtual funksiyalar uchun qoidalar quyidagicha: 1. Virtual funktsiyalar statik bo'lishi mumkin emas. 2. Virtual funktsiya boshqa sinfning do'st funktsiyasi bo'lishi mumkin. 3. Virtual funktsiyalarga ish vaqti polimorfizmiga erishish uchun ko'rsatgich yoki asosiy sinf turiga mos yozuvlar yordamida kirish kerak. 4. Virtual funktsiyalarning prototipi asosda ham, olingan sinfda ham bir xil bo'lishi kerak.

5. Ular har doim asosiy sinfda aniqlanadi va olingan sinfda bekor qilinadi. Olingan sinfni bekor qilish (yoki virtual funktsiyani qayta belgilash) majburiy emas, bu holda funktsiyaning asosiy sinf versiyasidan foydalaniladi. 6. Sinfda virtual destructor bo'lishi mumkin , lekin unda virtual konstruktor bo'lishi mumkin emas. Virtual funksiyalarning cheklovlari  Sekinroq: Funktsiya chaqiruvi virtual mexanizm tufayli biroz ko'proq vaqt oladi va kompilyatorni optimallashtirishni qiyinlashtiradi, chunki kompilyatsiya vaqtida qaysi funktsiya chaqirilishini aniq bilmaydi.  Nosozliklarni tuzatish qiyin: murakkab tizimda virtual funksiyalar funksiya qayerdan chaqirilayotganini aniqlashni biroz qiyinlashtirishi mumkin.  Hech qachon CONSTRUCTOR yoki DESTRUCTORdan virtual funktsiyani chaqirmang NAZARIY QISM B ir misolni ko rib chiqaylikʻ . Aslida child obyekti Parent sinfiga havola bo lsa ham, rParent Parent sinfiga ʻ havola bo lgani uchun Parent::getName() chaqiriladi. ʻ Quyida virtual metodlardan foydalangan holda ushbu muammoni qanday hal qilishni ko rib chiqamiz. C++ tilidagi virtual metod funksiyaning maxsus turi ʻ bo lib, chaqirilganda ajdod va avlod sinflari o rtasida mavjud bo lgan “eng katta” ʻ ʻ ʻ avlod metodi bajariladi. Bu xususiyat polimorfizm deb ham ataladi. Funksiya imzosi (nom, parametr turlari va metod) va avlod metodining qaytish turi ajdod- sinfning metodining imzosi va qaytish turiga mos kelganda, avlod metodi

chaqiriladi. Bu metodlarni qayta aniqlash deyiladi. Funksiyani virtual qilish uchun funksiya e’lonidan oldin virtual kalit so zini ko rsatish kifoya.ʻ ʻ - Birinchidan, C sinfining c obyekti yaratiladi; - rParent A sinfining havolasi bo lib, biz uni c obyektning A qismiga murojaat ʻ qilish uchun belgilaymiz; - Keyin Parent.getName() metodi chaqiriladi. Parent.getName() metodiga murojaat qilish A::getName() metodiga murojaat qilishga olib keladi. Biroq, A::getName() virtual funksiya bo lganligi sababli, ʻ kompilyator A va C o rtasida "eng katta" avlodning metodini qidiradi. Bu holda, ʻ “eng katta” metod C::getName() hisoblanadi. E'tibor bering, kompilyator D::getName() metodiga murojaat qilmaydi, chunki bizning asl obyektimiz D sinfi emas, C sinfi edi, shuning uchun faqat A va C sinflari orasidagi metodlar hisobga olinadi. Dasturni bajarish natijasi: rParent: C Yanada murakkabroq misolni ko rib chiqamiz. Animal sinfini ko rib ʻ ʻ chiqamiz.

Xuddi shu sinfni speak() metodini virtual qilish orqali ko rib chiqaylikʻ