nîíñòðónòîðaõ äëя çaäaíèя ía÷aëüíûõ çía÷åíèñ ïîëяì ðånîìåíäóåòñя èñïîëü- çîâaòü èíèöèaëèçaöèþ, a íå ïðèñâaèâaíèå:
Class X{
string s; publiC:
X(COnst Char * str);
};
// Âaðèaíò êîíñòðóêòîða ñ ïðèñâaèâaíèåì:
X::X(COnst Char * str){ s = str; }
// Âaðèaíò êîíñòðóêòîða ñ èíèöèaëèçaöèåé:
X::X(COnst Char * str): s(str){}
Èíèöèaëèçaöèя áîëåå óíèâåðñaëüía, òaê êaê ìîæåò ïðèìåíяòüñя â òåõ ñëó÷aяõ, êîãäa ïðèñâaèâaíèåì ïîëüçîâaòüñя íåëüçя (íaïðèìåð, ïðè çaäaíèè çía÷åíèé êîíñòaíòíûì ïîëяì èëè ññûëêaì). Êðîìå òîãî, îía âûïîëíяåòñя áîëåå ýôôåê- òèâíî, ïîòîìó ÷òî ñîçäaíèå îáúåêòa â C++ ía÷èíaåòñя ñ èíèöèaëèçaöèè åãî ïî- ëåé êîíñòðóêòîðîì ïî óìîë÷aíèþ, ïîñëå ÷åãî âûïîëíяåòñя âûçûâaåìûé êîíñò- ðóêòîð. Òaêèì îáðaçîì, äëя ïåðâîãî âaðèaíòa ðaññìîòðåííîãî ïðèìåða ñía÷aëa áóäåò âûçâaí êîíñòðóêòîð êëañña string ïî óìîë÷aíèþ, è òîëüêî ïîòîì áóäåò âû- ïîëíåíî ïðèñâaèâaíèå, â òî âðåìя êaê âòîðîé âaðèaíò ïîçâîëяåò ñðaçó æå âû- çâaòü íóæíûé êîíñòðóêòîð. Äëя ñëîæíûõ êëaññîâ, ñîñòaâëяþùèõ èåðaðõèþ, ðaç- íèöa ìåæäó ïðèâåäåííûìè âaðèaíòaìè ãîðaçäî çía÷èòåëüíåå.
Íåîáõîäèìî ó÷èòûâaòü è òîò ôaêò, ÷òî ïîëя èíèöèaëèçèðóþòñя â ïîðяäêå èõ îáú- яâëåíèя, a íå â ïîðяäêå ïîяâëåíèя â ñïèñêå èíèöèaëèçaöèè. Ïîýòîìó äëя óìåíü- øåíèя ÷èñëa âîçìîæíûõ îøèáîê ïîðяäîê óêaçaíèя ïîëåé â ñïèñêå èíèöèaëèça- öèè êîíñòðóêòîða äîëæåí ñîîòâåòñòâîâaòü ïîðяäêó èõ îáúяâëåíèя â êëaññå.
Còaòè÷åñêèå ïîëя íå äîëæíû èíèöèaëèçèðîâaòüñя â êîíñòðóêòîðå, ïîñêîëüêó èì íóæíî ïðèñâaèâaòü ía÷aëüíîå çía÷åíèå òîëüêî îäèí ðaç äëя êaæäîãî êëañña, a êîíñòðóêòîð âûïîëíяåòñя äëя êaæäîãî îáúåêòa êëañña. Còaòè÷åñêèå ïîëя èíè- öèaëèçèðóþòñя â ãëîáaëüíîé îáëañòè îïðåäåëåíèя (âíå ëþáîé ôóíêöèè).
Êîíñòðóêòîðû êîïèðîâaíèя òaêæå äîëæíû èñïîëüçîâaòü ñïèñêè èíèöèaëèçaöèè ïîëåé, ïîñêîëüêó èía÷å äëя áaçîâûõ êëaññîâ è âëîæåííûõ îáúåêòîâ áóäóò âûçâa- íû êîíñòðóêòîðû ïî óìîë÷aíèþ:
Class X{
publiC:
X(vOid);
// Êîíñòðóêòîð êîïèðîâaíèя: X(COnstX& r);
};
Class Y: publiC X{
string s; // Âëîzåííûé îáúåêò publiC:
// Êîíñòðóêòîð êîïèðîâaíèя: Y(COnst Y & r): X(r), s(r.s){}
};
Îïåðaöèя ïðèñâaèâaíèя íå íañëåäóåòñя, ïîýòîìó îía äîëæía áûòü îïðåäåëåía â ïðîèçâîäíûõ êëaññaõ. Ïðè ýòîì èç íåå ñëåäóåò яâíûì îáðaçîì âûçûâaòü ñîîòâåò- ñòâóþùóþ îïåðaöèþ áaçîâîãî êëañña (ñì. ñ. 204).
Íañëåäîâaíèå êëaññîâ ïðåäîñòaâëяåò ïðîãðaììèñòó áîãaòåéøèå âîçìîæíîñòè — âèðòóaëüíûå è íåâèðòóaëüíûå áaçîâûå êëaññû, îòêðûòîå, çaùèùåííîå è çaêðû- òîå íañëåäîâaíèå, âèðòóaëüíûå ìåòîäû è ò. ä. Âûáîð íaèáîëåå ïîäõîäяùèõ âîç- ìîæíîñòåé äëя öåëåé êîíêðåòíîãî ïðîåêòa îñíîâûâaåòñя ía çíaíèè ìåõaíèçìa èõ ðaáîòû è âçaèìîäåéñòâèя.
Îònðûòîå íañëåäîâaíèå nëañña Y èç nëañña X îçía÷aåò, ÷òî Y ïðåäñòaâëяåò ñî- áîñ ðaçíîâèäíîñòü nëañña X, òî åñòü áîëåå êîíêðåòíóþ, ÷añòíóþ êîíöåïöèþ. Áa- çîâûé êëaññ X яâëяåòñя áîëåå îáùèì ïîíяòèåì, ÷åì Y1. Âåçäå, ãäå ìîæíî èñ- ïîëüçîâaòü X, ìîæíî èñïîëüçîâaòü è Y, íî íå íaîáîðîò (âñïîìíèòå, ÷òî ía ìåñòî ññûëîê ía áaçîâûé êëaññ ìîæíî ïåðåäaâaòü ññûëêó ía ëþáîé èç ïðîèçâîäíûõ). Íåîáõîäèìî ïîìíèòü, ÷òî âî âðåìя âûïîëíåíèя ïðîãðaììû íå ñóùåñòâóåò èåðaðõèè êëaññîâ è ïåðåäa÷è ñîîáùåíèé îáúåêòaì áaçîâîãî êëañña èç ïðîèçâîä- íûõ — åñòü òîëüêî êîíêðåòíûå îáúåêòû êëaññîâ, ïîëя êîòîðûõ ôîðìèðóþòñя ía îñíîâå èåðaðõèè ía ýòaïå êîìïèëяöèè.
Ìåòîäû, nîòîðûå äîëxíû èìåòü âñå ïðîèçâîäíûå nëaññû, íî nîòîðûå íå ìîãóò áûòü ðåaëèçîâaíû ía óðîâíå áaçîâîãî nëañña, äîëxíû áûòü âèðòóaëüíûìè. Ía- ïðèìåð, âñå îáúåêòû èåðaðõèè äîëæíû óìåòü âûâîäèòü èíôîðìaöèþ î ñåáå. Ïî- ñêîëüêó îía õðaíèòñя â ðaçëè÷íûõ ïîëяõ ïðîèçâîäíûõ êëaññîâ, ýòó ôóíêöèþ íåëüçя ðåaëèçîâaòü â áaçîâîì êëaññå. Åñòåñòâåííî íaçâaòü åå âî âñåõ êëaññaõ îäè- íaêîâî è îáúяâèòü êaê âèðòóaëüíóþ ñ òåì, ÷òîáû äðóãèå ìåòîäû áaçîâîãî êëañña ìîãëè âûçûâaòü åå â çaâèñèìîñòè îò ôaêòè÷åñêîãî òèïa îáúåêòa, ñ êîòîðûì îíè ðaáîòaþò. Ïî ýòîé ïðè÷èíå äåñòðónòîðû îáúяâëяþòñя nan âèðòóaëüíûå.
Ïðè ïåðåîïðåäåëåíèè âèðòóaëüíûõ ìåòîäîâ íåëüçя èçìåíяòü íañëåäóåìîå çía÷å- íèå aðãóìåíòa ïî óìîë÷aíèþ, ïîñêîëüêó ïî ïðaâèëaì C++ îíî îïðåäåëяåòñя òè- ïîì óêaçaòåëя, a íå ôaêòè÷åñêèì òèïîì îáúåêòa, âûçâaâøåãî ìåòîä:
inClude Class X{
publiC:
virtual vOid fun(int a = 0){COut << a;}
};
Class Y: publiC X{ publiC:
virtual vOid fun(inta= 1) {COut << a;}
};
int main(){
X *px = new X;
px->fun(); // Âûâîäèòñя 0
1 Íaïðèìåð, êaæäûé ïðîãðaììèñò — ÷åëîâåê, íî íå êaæäûé ÷åëîâåê — ïðîãðaììèñò.
X *py = new Y;
py->fun(); // Âûâîäèòñя 0
}
Íåâèðòóaëüíûå ìåòîäû ïåðåîïðåäåëяòü â ïðîèçâîäíûõ nëaññaõ íå ðånîìåíäóåòñя, ïîñêîëüêó ïðîèçâîäíûå êëaññû äîëæíû íañëåäîâaòü ñâîéñòâa áaçîâûõ. Èíûìè ñëîâaìè, íåâèðòóaëüíûé ìåòîä èíâaðèaíòåí îòíîñèòåëüíî ñïåöèaëèçaöèè, òî åñòü ñîõðaíяåò òå ñâîéñòâa, êîòîðûå äîëæíû íañëåäîâaòüñя èç áaçîâîãî êëañña íåçaâèñèìî îò òîãî, êaê êîíêðåòèçèðóåòñя (ñïåöèaëèçèðóåòñя) ïðîèçâîäíûé êëaññ. Cïåöèaëèçaöèя ïðîèçâîäíîãî êëañña äîñòèãaåòñя äîáaâëåíèåì íîâûõ ìå- òîäîâ è ïåðåîïðåäåëåíèåì ñóùåñòâóþùèõ âèðòóaëüíûõ ìåòîäîâ.
Ãëaâíîå ïðåèìóùåñòâî íañëåäîâaíèя ñîñòîèò â òîì, ÷òî ìîæíî ía óðîâíå áaçî- âîãî êëañña íaïèñaòü óíèâåðñaëüíûé êîä, ñ ïîìîùüþ êîòîðîãî ìîæíî ðaáîòaòü è ñ îáúåêòaìè ïðîèçâîäíîãî êëañña, ÷òî ðåaëèçóåòñя ñ ïîìîùüþ âèðòóaëüíûõ ìåòîäîâ.
Àëüòåðíaòèâíûì íañëåäîâaíèþ ìåòîäîì èñïîëüçîâaíèя îäíèì êëaññîì äðóãîãî яâëяåòñя âëîxåíèå, êîãäa îäèí êëaññ яâëяåòñя ïîëåì äðóãîãî:
Class X{ ¼ }; Class Y{
X x;
…
};
Âëîæåíèå ïðåäñòaâëяåò îòíîøåíèя êëaññîâ «Y ñîäåðxèò X» èëè «Y ðåaëèçóåòñя ïîñðåäñòâîì Õ». Íåîáõîäèìîñòü èñïîëüçîâaòü âëîæåíèå âìåñòî íañëåäîâaíèя ìîæíî îïðåäåëèòü, çaäaâ ñåáå âîïðîñ, ìîæåò ëè ó Y áûòü íåñêîëüêî îáúåêòîâ êëañña X. Åñëè òðåáóåòñя, ê ïðèìåðó, îïèñaòü êëaññ äëя ìîäåëèðîâaíèя ñaìîëåòa, áóäåò ëîãè÷íî îïèñaòü â íåì ïîëå òèïa «äâèãaòåëü»: ñaìîëåò ñîäåðæèò äâèãaòåëü, íî íå яâëяåòñя åãî ðaçíîâèäíîñòüþ.
Îòíîøåíèå «ðåaëèçóåòñя ïîñðåäñòâîì» èñïîëüçóåòñя âìåñòî íañëåäîâaíèя òîãäa, êîãäa ïðî êëaññûXèY íåëüçя ñêaçaòü, ÷òî Y яâëяåòñя ðaçíîâèäíîñòüþ X, íî ïðè ýòîì Y èñïîëüçóåò ÷añòü ôóíêöèîíaëüíîñòè X. Cëåäóåò ïðåäïî÷èòaòü âëîæåíèå íañëåäîâaíèþ.
 ñëó÷aяõ, êîãäa ìåæäó êëaññaìè íåò ëîãè÷åñêîé âçaèìîñâяçè, a òðåáóåòñя ïðî- ñòî èñïîëüçîâaòü ÷añòü êîäa îäíîãî êëañña â äðóãîì, ìîæåò áûòü ïîëåçíûì èñ- ïîëüçîâaòü çaêðûòîå íañëåäîâaíèå (ñ êëþ÷îì äîñòóïa private). Ýòîò ñïîñîá èñ- ïîëüçóåòñя, êîãäa â ïðîèçâîäíîì êëaññå òðåáóåòñя äîñòóï ê çaùèùåííûì ýëåìåíòaì áaçîâîãî êëañña è çaìåùåíèå åãî âèðòóaëüíûõ ìåòîäîâ.
Øaáëîíû nëaññîâ èñïîëüçóþòñя äëя ñîçäaíèя ñåìåéñòâ êëaññîâ, ïîâåäåíèå êîòî- ðûõ íå çaâèñèò îò òèïa îáúåêòîâ. Øaáëîíû ñëåäóåò èñïîëüçîâaòü aêêóðaòíî, îò- äaâaя ñåáå îò÷åò â òîì, ÷òî äëя êaæäîãî òèïa ïîðîæäaåòñя ñîáñòâåííaя êîïèя øaáëîía, ÷òî ìîæåò ïðèâåñòè ê ðaçáóõaíèþ êîäa. Äëя óìåíüøåíèя ðaçìåða êîäa ðåêîìåíäóåòñя âûíåñòè â áaçîâûé êëaññ âñå ìåòîäû, íå èñïîëüçóþùèå èíôîðìa- öèþ î òèïå îáúåêòa, è óíañëåäîâaòü îò íåãî øaáëîííûé êëaññ ñî âñåìè îñòaëüíû- ìè ìåòîäaìè. Ýòî ïîçâîëèò èçáåæaòü äóáëèðîâaíèя òåõ ìåòîäîâ, òåêñòû êîòîðûõ íå çaâèñяò îò ïaðaìåòða øaáëîía.
Èñêëþ÷åíèя èñïîëüçóþòñя, êaê ïðaâèëî, â òåõ ñëó÷aяõ, êîãäa èíîãî ñïîñîáa ñî- îáùèòü îá îøèáêå íå ñóùåñòâóåò (íaïðèìåð, åñëè îía ïðîèçîøëa â êîíñòðóêòîðå èëè ïåðåãðóæåííîé îïåðaöèè), a òaêæå êîãäa îøèáêa íåèñïðaâèìaя èëè î÷åíü ðåäêaя è íåîæèäaííaя. Îáðaáîòêa èñêëþ÷åíèé íåñêîëüêî óìåíüøaåò ïðîèçâîäè- òåëüíîñòü ïðîãðaììû è, ñ ìîåé òî÷êè çðåíèя, óõóäøaåò åå ÷èòaåìîñòü, ïîýòîìó áåç íåîáõîäèìîñòè ïîëüçîâaòüñя èñêëþ÷åíèяìè íå íóæíî.
Äëя áîëåå ïîäðîáíîãî èçó÷åíèя ðaññìîòðåííûõ â ýòîì ðaçäåëå âîïðîñîâ ðåêî- ìåíäóåòñя îáðaòèòüñя ê êíèãaì À. Ãîëóáa [9] è C. Ìåéåðña [13].
Do'stlaringiz bilan baham: |