Энергетика



Pdf көрінісі
бет14/23
Дата07.02.2022
өлшемі1,03 Mb.
#91462
түріПрограмма
1   ...   10   11   12   13   14   15   16   17   ...   23
Байланысты:
is 1

 
 
9 Дәріс №9. Абстрактылы кластар

Дәрістің мақсаты: 
абстрактты кластар түсінігін беру. 
Дәрістің мазмұны: 
Локальды кластар. Класс құрылымы бойынша 
жасалатын ұсыныстар. 


35 
Ереже бойынша базалық класта жарияланған виртуалды функция 
ешқандай маңызды әдістерді орындамайды. Бұл әдеттегі жағдай, себебі жеке 
түрде базалық класта деректердің аяқталған типі анықталмайды. Оның 
орнына тек мүше функциясының базалық жиыны мен жетпейтіндердің бәрін 
туынды класс анықтайтын айнымалылар болады. Базалық кластың виртуалды 
функциясында негізгі әрекет болмаған кезде осы базалықтан кез келген 
туынды класта мұндай функция міндетті түрде қайта анықталған болуы керек.
Оны С++ тілінде жүзеге асыру үшін таза виртуалды (pure virtual function) деп 
аталатындар қолдау табады. 
Таза виртуалды функциялар абстрактты әдістер базалық класта 
анықталмайды. Оған тек қана осы функциялардың прототиптері енеді. Таза 
виртуалды функция үшін осындай негізгі форма қолданылады: 
аты _типі (параметрлер_ тізімі) = 0 
Функцияларды нөлге теңестіру компиляторға базалық класта осы 
функцияның денесі жоқ екендігін хабарлайды. Мұндай жағдайда ол әрбір 
туынды класта міндетті түрде ауыстырылып отыруы керек. Әйтпесе 
компиляция кезінде қате туындайды. 
Ең болмаса бір абстрактты әдісі бар класс абстрактты деп аталады. 
Абстрактылы класс басқа кластар үшін базалық ретінде қызмет ете 
алады және абстрактылы класс объектісін құру мүмкін емес. Абстрактылы 
кластан туынды кластар, абстрактты әдістер анықталуы керек немесе 
абстрактты сияқты қайта жариялануы керек. 
Абстрактты класс бар деп есептейік:
Class Base 
{ protected :virtual void f(char)=0; 
void func(int); 
}; 
Base абстрактты класс негізінде туынды класты түрінде құруға болады: 
Class Der1:public Base 
{….void f (char); }; 
Class Der2:public Base 
{….void func (int); }; 
Der1 класында f ( ) абстрактты әдісі осы типтің нақты виртуалды 
функциясымен ауыстырылған. Base: : func ( ) функциясы Der1 класымен 
мұрагерленеді және оның әдістері мен қатынауын мұрагерленеді. Der1 класы 
абстрактты емес. Der2 класында Base:: func ( ) функциясы қайта анықталған, 


36 
ал Base:: f () виртуалды функциясы мұрагерленген. Сонымен бірге класс Der2 
абстрактылы болады және базалық ретінде ғана қолданылады.
Әрбір клас сияқты абстрактты класс анықталған конструкторға ие болуы 
мүмкін. Конструктордан кластар әдістерін шақыруы мүмкін, бірақ кез келген 
тура немесе тура емес таза виртуалды функцияларға қатынасы бағдарламаны 
орындаған кездегі қателерге әкеледі.
Кейін нақтылауға ұсынылатын пәндік облыстың жалпы түсініктерін 
беру үшін абстрактылы кластар механизмі өндірілген. Бұл жалпы түсініктерді 
әдетте тікелей қолдану мүмкін емес, бірақ құруға жарамды жеке туынды 
кластарды құруға болады. Мысалы, абстрактты «Фигура» класынан 
«Үшбұрыш», «Шеңбер» және тағы басқа кластарды құруға болады. 
Абстрактылы әдістер кластармен жұмыс істеуге арналған анағұрлым 
маңызды ережелерді құрайық:
1)
Әдіс параметрінің типі, мәнді қайтаратын әдіс сияқты абстрактылы 
класс бола алмайды. 
2)
Егер абстрактылы базалық класқа оның инициализациясы үшін 
уақытша объектті құру талап етілмесе, онда көрсеткіш құруға, сонымен қатар 
осындай класқа жасалатын сілтемеге рұқсат етілген (және ол жиі 
қолданылады). 
3)
Абстрактылы класс әдістері осы кластың абстрактылы әдістерін 
шақыра алады. Осындай жағдайда объект типіне сәйкес келетін туынды 
класта анықталған әдіс шақырылатын болады. 
4)
Егер абстрактылы кластан туынды класта барлық абстрактылы әдіс 
функциялары шақырылса, онда туынды класс соған қоса абстрактылы болып 
табылады.
5)
Абстрактылы кластан кез келген туынды класс одан абстрактылы 
әдістерін мұрагерленеді. Туынды кластың объектісін құру мүмкіндігін алу 
үшін онда барлық абстрактылы әдістерді қайта анықтау керек. 
6)
Абстрактылы класс конструкторлар мен деструкторларға ие бола 
алады. 
Абстрактылы кластың конструкторы туынды класс объектілерін құрған 
кезде, ал деструктор олардың қатынауы кезінде шақырылатын болады. 
Базалық класс деструкторы туынды кластарда анықталған «ішкі объектілер» 
бұзылғаннан кейін шақырылады. Сондықтан абстрактылы базалық класс 
деструкторы өз класының абстрактылы әдістерін шақырмау керек, себебі 
мұндай шақыру бағдарламаны орындағанда қатеге әкеледі.
Локальды кластар.
Класс блоктың ішінде берілуі мүмкін, мысалы функция анықтамасының 
ішінде. Мұндай класс локальды деп аталады. Класс локализациясы кластың 
анықталу облысынан тыс оның компаненттеріне байланысты қатынамауды 
тұжырымдайды (ол анықталған немесе сипатталған функция немесе блоктың 
денесінен тыс).
Локальды класс статикалық деректерге ие бола алмайды, себебі 
локальды кластың компоненттері класс мәтінінен тыс анықталуы мүмкін емес.


37 
Локальды кластың ішінде оның айналасындағы облысынан тек типтер 
атауларын, статикалық (static), сыртқы (extern) айнымалыларды, сыртқы 
функциялар мен санауыш элементтерін қолдануға рұқсат етілген. Локальды 
кластардың компоннетті функциялары тек енгізілген (inline) болуы мүмкін.
Класс құрылымы бойынша жасалатын ұсыныстар. 
 
Әдетте класс қолданушы типі сияқты құрамына жасырын (private) мүше 
- деректердің саны және келесі әдістері кірмейді:
-
класс объектілерін инициализациялаудың әдістерін анықтайтын 
конструкторлар және қажет болғанда динамикалық жадыны резирверлеуді 
қамтамасыз ететін конструкторлар;
-
көшіріп алу конструкторы (егер класс динамикалық жады үшін 
қолданылса қажет болады);
-
деструктор (егер класс динамикалық жады үшін қолданылса қажет 
болады);
-
класс қасиеттерін жүзеге асыратын әдістер жиыны ( бұл кезде кластың 
private – мүше – деректерінің мәндерін қайтаратын әдістер өрістер мәндерін 
өзгерте алмайтындығын көрсететін const модификаторымен сипатталуы 
керек); 
-
класта қажет етілетін объекттерді салыстыруға, өзіне алуға, 
арифметикалық және басқа әрекеттерді орындауға мүмкіндік беретін 
операциялар жиыны;
-
қателер туралы хабарламалар үшін қолданылатын ерекшеліктерді 
өңдеу құрылғылары. 
Класты жобалаған кезде келесі сұрақтар өте маңызды болып табылады. 
Кластың мүше - деректер құрылымын және олардың тиесілігін қалай 
анықтайды? Класс әдістері мен тиесілігін қалай анықтайды? 
Егер берілген класс әдістермен ғана қолданылса, онда оны жапқан жөн 
болады. Егер берілген класс пен оның туындыларында қатынау қажет болса, 
онда оны қорғау керек. Мүше - деректерді ешқашан ашпаған жөн, себебі 
класс әлсіз болып қалады, ал бұл программалық кодты сенімсіз етеді. 
Класс 
пен 
қолданушы 
кластың 
интерфейсті 
әдістері 
мен 
деструкторлары, конструкуторларының барлық түрлері көмегімен байланыса 
алады, сондықтан оларды кез келген программалық ортадан рұқсат етілген 
болуын жасау керек. Көмекші интерфейсті емес, егер олар тек осы класта, 
немесе қорғау (protected), егер олар осы және одан да туынды кластарда керек 
болса әдістерді жабық (private) ету керек. 
Бақылау сұрақтары: 
1)
Виртуалды функция дегеніміз не? 
2)
Қандай функциялар виртуалды бола алмайды? 
3)
Қалай виртуалды функциялар динамикалық полиморфизмді жүзеге 
асыруға көмектеседі? 
4)
Абстрактылы класс дегеніміз не? 
5)
Полиморфты класс дегеніміз не? 


38 


Достарыңызбен бөлісу:
1   ...   10   11   12   13   14   15   16   17   ...   23




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет