14-ma’ruza. Sinfning virtual metodlari va ularni ishlatish mexanizmlari. Abstrakt sinflar, ularning mo’ljallanishi va xususiyatlari



Yüklə 31,62 Kb.
səhifə6/6
tarix02.12.2022
ölçüsü31,62 Kb.
#71888
1   2   3   4   5   6
14 ma’ruza Sinfning virtual metodlari va ularni ishlatish mexanizmlari

Interfeyslar. Interfeys - bu a'zo o'zgaruvchilari bo'lmagan sinf va uning barcha usullari sof virtual funktsiyalardir! Interfeyslar "sinf-interfeyslar " yoki "interfeys sinflari" deb ham ataladi.
Interfeys sinflari odatda boshida I bilan nomlanadi, masalan:

class IErrorLog


{
public:
virtual bool openLog(const char *filename) = 0;
virtual bool closeLog() = 0;
virtual bool writeError(const char *errorMessage) = 0;
virtual ~IErrorLog() {}; // virtual destruktor yarating,
//shunda IErrorLog ga ko'rsatgichni o'chirsak, avlod sinfining mos keladigan
//destruktori chaqiriladi.
};

IErrorLog ni meros qilib olgan har qanday sinf IErrorLog sinfining barcha 3 ta metodini realizatsiyasini ta'minlashi kerak. FileErrorLog nomli avlod sinfini yaratishingiz mumkin, bunda openLog() diskdagi faylni ochadi, closeLog() faylni yopadi va writeError() faylga xabar yozadi. Siz ScreenErrorLog nomli boshqa avlod sinfini yaratishingiz mumkin, bu erda openLog() va closeLog() hech narsa qilmaydi va writeError () qalqib chiquvchi oynada xabarni ko'rsatadi.


Endi siz xato jurnalidan foydalanadigan dastur yozmoqchi bo'lsangiz, deylik. FileErrorLog yoki ScreenErrorLog sinflarini bevosita yozish samarasiz. Misol uchun, quyidagi funktsiya mySqrt () deb chaqiradigan barcha ob'ektlarni FileErrorLogdan foydalanishiga olib keladi, bu har doim ham mos kelmasligi mumkin:

include // для sqrt()


double mySqrt(double value, FileErrorLog &log)
{
if (value < 0.0)
{
log.writeError("0 dan kichik qiymatning kvadrat ildizini olishga harakat qildi");
return 0.0;
}
else
return sqrt(value);
}

IErrorLog orqali amalga oshirish ancha yaxshi variant bo'ladi:


#include // для sqrt()


double mySqrt(double value, IErrorLog &log)
{
if (value < 0.0)
{
log.writeError("0 dan kichik qiymatning kvadrat ildizini olishga harakat qildi");
return 0.0;
}
else
return sqrt(value);
}

Endi foydalanuvchi obyektlarni uzatish orqali qaysi sinfni chaqirish kerakligini mustaqil ravishda aniqlashi mumkin. Agar u xato faylga yozilishini istasa, u FileErrorLog sinfining ob'ektini mySqrt () funksiyasiga o'tkazadi. Agar u xato ekranda ko'rsatilishini xohlasa, u ScreenErrorLog sinfining obyektini o'tkazadi. Yoki, agar u siz ko'rmagan ishni qilmoqchi bo'lsa, masalan, elektron pochta orqali kimgadir xato xabari yuborsa, u IErrorLog-dan meros bo'ladigan yangi EmailErrorLog sinfini yaratishi va shu sinf ob'ektini o'tkazishi mumkin! Shunday qilib, IErrorLog orqali amalga oshirish bizning funktsiyamizni yanada moslashuvchan va mustaqil qiladi.


Virtual destruktorlarni interfeys sinflariga ulashni unutmang, shunda interfeys ko'rsatgichini o'chirishda tegishli (avlod) sinfning destruktori chaqiriladi.
Interfeyslar juda mashhur, chunki ulardan foydalanish oson, texnik xizmat ko'rsatish va kengaytirish oson. Java va C # kabi ba'zi tillar hatto o'zlarining sintaksisiga interfeys kalit so'zini qo'shgan, bu dasturchilarga barcha usullar mavhum ekanligini aniq ko'rsatmasdan interfeys sinfini to'g'ridan-to'g'ri aniqlash imkonini beradi.


Yüklə 31,62 Kb.

Dostları ilə paylaş:
1   2   3   4   5   6




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©azkurs.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin