Sinflar orasida munosabatlar.
Mavzu: Sinflar orasida munosabatlar. Reja: 1. Abstrakt sinflar. 2. Inkapsulyasiya, Vorislik , Polimorfizm tushunchalari. 3. Samarali inkapsulyasiyalash. 4. Sodda vorislik. Ko’plikdagi vorislik. Polimorf usullar.
Abstrakt sinf ta’rifi. Hech bo’lmasa bitta sof (bo’sh) virtual funksiyaga ega bo’lgan sinf abstrakt sinf deyiladi. Quyidagi e’longa ega bo’lgan komponentali funksiya sof virtual funksiya deyiladi: virtual <tur> <funksiya_nomi> (<formal_parametrlar_ro’yxati>) = 0; Bu yozuvda « = 0» konstruksiya «sof spesifikator» deyiladi. Sof virtual funksiya ta’rifiga misol: virtual void fpure (void) = 0; Sof virtual funksiya hech narsa qilmaydi va uni chaqirib bo’lmaydi. Uning qo’llanilishi – hosila sinflarda uning o’rnini egallovchi funksiyalar uchun asos bo’lish. Abstrakt sinf esa hosila sinf uchun asosiy (bazaviy) sinf sifatida ishlatilishi mumkin. Agar sof virtual funksiya hosila sinfda to’liq ta’riflanmasa, u hosila sinfda ham sof virtual bo’lib qoladi, natijada hosila sinf ham abstrakt sinf bo’ladi. Abstrakt sinfni faqat boshqa sinf ajdodi sifatida ishlatish mumkin: Ba’zi sinflar abstrakt tushunchalarni ifodalaydi va ular uchun ob’ekt yaratib bo’lmaydi. Bunday sinflar biror hosila sinfda ma’noga ega bo’ladi:masalan, class Abstract { public: virtual void draw() = 0; }; class Derived : public Abstract { public: void draw() { cout « "Salom.";} }; int main( void ) { Derived d;
Abstract a; return 0; } Agar sof virtual funksiya hosila sinfda to’liq ta’riflanmasa, u hosila sinfda ham sof virtual bo’lib qoladi, natijada hosila sinf ham abstrakt sinf bo’ladi. class Abstract { virtual int f() = 0; virtual float g(float) = 0; }; class Derived : class Abstract { int f(); }; int main (void) { Abstract a; //hato Derived d; // hato } Abstrakt sinflar realizasiya detallarini aniqlashtirmasdan faqat interfeysni ko’rsatish uchun ishlatiladi. Masalan, operasion tizimda qurilma drayveri abstract sinf sifatida berilishi mumkin: class character_device { public: virtual int open() = 0; virtual int close(const char*) = 0; virtual int read(const char*, int) = 0; virtual int write(const char*, int) = 0; virtual int ioctl(int ...) = 0; // ...
}; Drayverlar character_device sinfining ajdodlari sifatida kiritilishi mumkin.Abstrakt sinf turidagi o’zgaruvchi yaratib bo’lmaydi, lekin abstrakt sinf turidagi ko’rsatkich yaratish mumkin. Bu ko’rsatkichga abstrakt sinf abstract bo’lmagan turli avlodlari adresini qiymat sifatida berib, abstrakt usulga mos turli usullarni chaqirish mumkin. 2. Inkapsulyasiya, Vorislik , Polimorfizm tushunchalari. Inkapsulyasiya Inkapsulatsiyalash, vorislik va polimorfizm obyektga mo'ljallangan dasturlash (OMD) ning uchta bazaviy tushunchasi hisoblanadi. Inkapsulyasiyalash - ma’lumotlarning va shu ma’lumotlar ustida ish olib boradigan kodlarning bitta ob’ektda birlashtirilishi. OMD atamachiligida ma’lumotlar ob’ekt ma’lumotlari a’zolari (data members) deb, kodlar ob’ektli usullar yoki funksiya-a’zolari (methods, member functions) deb ataladi. Inkapsulyasiya yordamida berilganlarni yashirish ta’minlanadi. Bu juda yaxshi xarakteristika bo’lib foydalanuvchi o’zi ishlatayotgan ob’ektning ichki ishlari haqida umuman o’ylamaydi. Haqiqatan ham, xolodilnikni ishlatishda refrijektorni ishlash prinsipini bilish shart emas. Yaxshi ishlab chiqilgan dastur ob’ektini qo’llashda uning ichki o’zgaruvchilarining o’zaro munosabati haqida qayg’urish zarur emas. C++ tilida inkapsulyasiya prinsipi sinf deb ataluvchi nostandart turlarni(foydalanuvchi turlarini) hosil qilish orqali himoya qilinadi. Inkapsulatsiyalash dasturni qandaydir monolit, boiinmas narsa sifatida olib qaramay, ko'plab mustaqil elementlarga bo'lish imkonini beradi. Har bir element o'z funksiyalarini boshqa elementlardan mustaqil ravishda bajara oladigan alohida modul sifatida olib qaraladi. Aynan inkapsulatsiyalash tufayli mustaqillik darajasi ortadi, chunki ichki detallar interfeys ortida yashiringan boiadi. Vorislik
Vorislik mavjud bo'lgan sinfning ta'rifi asosidayoq yangi sinfni yaratish| imkonini beradi. Yangi sinf boshqasi asosida yaratilgach, uning ta'rifi avtomatik tarzda mavjud sinfning barcha xususiyatlari, xulq-atvori va joriy qilinishiga vorislik qiladi. Awal mavjud bo’lgan sinf interfeysining barcha metodlari va xususiyatlari avtomatik tarzda voris interfeysida paydo bo'ladi. Vorislik voris sinfida biror bir jihatdan to'g'ri kelmagan xulq-atvorni awaldan ko'ra bilish imkonini beradi. Bunday foydali xususiyat dasturiy ta'minotni talablarning o'zgarishiga moslashtirish imkonini beradi. Agar o'zgartirishlar kiritishga ehtiyoj tug'ilsa, bu holda eski sinf funksiyalariga vorislik qiluvchi yangi sinf yozib qo'ya qolinadi. Keyin o'zgartirilishi lozim boMgan funksiyalarga qaytadan ta'rif beriladi hamda yangi funksiyalar qo'shiladi. Bunday o'rniga o'rin qo'yishning mazmuni shundan iboratki, u dastlabki sinf ta'rifini o'zgartirmay turib, obyekt ishini o'zgartirish imkonini beradi. Agar siz ko'p martalab qo'Uash yoki boshqa biron maqsadlarga ko'ra vorislikni qo’llashga ahd qilsangiz, awal har gal qarang — merosxo'r—sinf bilan vorislikni berayotgan sinfning turlari o'zaro mos keladimi? Vorislikda turlarning mos kelishi ko'pincha «Is-a» testi deb ataladi. Ikkita sinf bir xil turga ega bo'lgandagina o'zaro «Is-а» munosabatida turibdi deb hisoblanadi. Vorislik — sinflar o'rtasida «Is-а» munosabatlarini o'rnatish imkonini beradigan mexanizm. Merosxo'r sinf o'z ajdodi bo’lgan sinfdan xususiyatlar va xulq-atvorni meros qilib olayotganida, u shuningdek, o'z ajdodi boMgan sinf, ehtimol, boshqa sinflardan meros qilib olgan xususiyatlar va xulq-atvorga ham ega bo’ladi. Vorislik tabaqalanishi qandaydir ma'no kasb etishi uchun ajdodlar ustidan qanday amallar bajarilgan boMsa, avlodlar ustidan ham shunday amallar bajarilish imkoniyati boMishi lozim. Bu «Is-а» testi yordamida tekshiriladi. Merosxo'r sinfga funksiyalarni kengaytirish va yangilarini qo'shish uchun ruxsat beriladi. Ammo unga funksiyalarni chiqarib tashlashga ruxsat yo'q.