#include
class X{
public:
virtual void fun(int a = 0){cout << a;}
};
class Y: public X{
public:
virtual void fun(int a = 1) {cout << a;}
};
int main(){
X *px = new X;
px->fun(); // 0 шығарылады
X *py = new Y;
py->fun(); // 0 шығарылады
}
Виртуалды емес əдістерді туынды кластарда қайталап анықтау қажет
емес, себебі туынды кластар базалық кластардың қасиеттерін мұралап алуы
керек. Басқаша айтқанда, виртуалды емес əдіс специализацияға қатысты ин-
вариантты болып саналады, яғни туынды кластың қалай нақтыланатынына
тəуелсіз базалық кластан мұралануы тиіс қасиеттерді бойында сақтайды.
Туынды кластың специализациялануы жаңа əдістерді қосу жолымен жəне
бұрыннан бар виртуалды əдістерді қайта анықтау арқылы орындалады.
Мұралаудың негізгі артықшылығы – базалық класс деңгейінде əмбебап
код жазып, соның көмегімен виртуалды əдістер арқылы туынды кластардың
объектілерімен жұмыс жасауға болады.
Мұралауға альтернативті түрде бір кластың екінші класты пайдалануы
үшін енгізілген əдіс қабаттастыру болып табылады, мұнда бір класс басқа
бір кластың өрісі болып саналады:
class Х{ ... };
class Y{
X х;
...
};
265
Қабаттастыру кластардың «Ү құрамында Х» немесе «Ү Х арқылы жүзеге
асырылады» деген сияқты қатынастарын сипаттайды. Мұралаудың орнына
қабаттастыруды қолданудың қажеттілігін «Ү құрамында Х класының бірнеше
объектісі болуы мүмкін бе» деген сұрақты қоя отырып анықтауға болады.
Мысалы, егер ұшақты модельдеуге арналған класты сипаттау қажет болса,
оның құрамында «қозғалтқыш» типті өрісті сипаттаған жөн болады: ұшақ
құрамында қозғалтқыш бар, бірақ ол ұшақтың бір түрі болып саналмайды.
Ү класы Х класының бір түрі болады деп айта алмайтын, бірақ Ү класы
Х класы функционалдылығының бір бөлігін қолданатын кезде «... арқылы
жүзеге асырылады» қатынасы мұралаудың орнына пайдаланылады. Мұралау
орнына қабаттастыруды қолдану дұрысырақ болып табылады.
Кластар арасында логикалық өзара байланыс болмай, тек бір класс кодының
бөлігін басқа бір класта қолдану керек болған жағдайда жабық мұралауды
(
private
қол жеткізу кілті бар) қолданған тиімді болуы мүмкін. Бұл тəсіл
туынды класта базалық кластың қорғалған элементтеріне қол жеткізу жəне
оның виртуалды əдістердің орнын басу керек болған кезде қолданылады.
Класс шаблондары іс-əрекеттері объектілер типіне байланысты болмай-
тын класс топтарын құру үшін қолданылады. Шаблондарды мұқият болып,
əрбір тип үшін өзіндік шаблон көшірмесі құрылатындықтан, код көлемі артуы
мүмкін екендігін есте сақтай отырып қолдану керек. Кодтың көлемін азайту
үшін объект типі туралы ақпаратты пайдаланбайтын барлық əдістерді базалық
класқа шығару жəне одан шаблондық əдісті барлық басқа əдістермен бірге
мұралау ұсынылады. Осы арқылы мəтіндері шаблон параметрлеріне тəуелді
болмайтын əдістердің қайталануынан сақтанамыз.
Көбінесе ерекше жағдайлар қателік туралы хабар берудің басқа тəсілі жоқ
болған кезде (мысалы, қателік конструкторда немесе асыра жүктелген опера-
цияда туындаса) пайдаланылады, сонымен қатар олар түзетілмейтін немесе
өте сирек кездесетін күтілмеген қателіктер туындағанда қолданылады. Ерек-
ше жағдайларды өңдеу программаның өнімділігін айтарлықтай төмендетеді,
автордың көзқарасы бойынша, ол программаның оқылуын да нашарлатады,
сондықтан ерекше жағдайларды қажет болмаған кезде қолданбаған жөн.
Осы бөлімде қарастырылған сұрақтарды толығырақ меңгеру үшін
А. Голубтың [9] жəне С. Мейерстің [13] кітаптарын қолдану ұсынылады.
266
Достарыңызбен бөлісу: |