лекции (2008) (by Kravets) (укороченное) (1160827), страница 16
Текст из файла (страница 16)
ßçûêè â êîòîðûõ åñòüïîíÿòèÿ ìîäóëÿ (Delphi, Java, C#) èìåþò îñîáûå ñïåöèôèêàöèè äîñòóïà äëÿ îáúåêòîâ èç òîãî æå ìîäóëÿ. Java åñòü ïîíÿòèå ïàêåòà (íå ïóòàòü ñ ïàêåòîì Àäà). Package - åäèíèöà óïðàâëåíèÿ êîíòåêñòîì è åäèíèöàäèñòðèáóöèè. Ñ# namespace - åäèíèöà óïðàâëåíèÿ êîíòåêñòîì, ñáîðêà - åäèíèöà óïðàâëåíèå äèñòðèáóöèåé. Ïðè ýòîìñáîðêà - ýòî íå ïîíÿòèå óðîâíÿ ÿçûêà.
Òî åñòü íåò êëþ÷åâîãî ñëîâà assembly, íî êîãäà ïðîèñõîäèò ñáîðêà, òîîíà ïîìåùàåòñÿ èìåííî â assembly. Java ïîÿâëÿåòñÿ ïàêåòíûé äîñòóï (ìîäèôèêàòîðà íåò, ÿâëÿåòñÿ äîñòóïîì ïî óìîë÷àíèþ).  C# ïîíÿòèåinternal (äîñòóï äëÿ âñåõ êëàññîâ èç òîé æå ñáîðêè).Ïî óìîë÷àíèþ â C# - private.publicprotectedinternalprivateñâîé++++ïîòîìîê ïðîèçâîäíûé ìèð(÷óæîé)+++++*+**+-* Java protected ÿâëÿåòñÿ è ïàêåòíûå äîñòóï.  C# åñëè protected, òî äîñòóï òîëüêî èç ïðîèçâîäíûõ.ÂC# åñòü äâîéíîé ìîäèôèêàòîð, òî åñòü protected internal - äîñòóï è äëÿ ïîòîìêîâ è äëÿ îáúåêòîâ òîé æåñáîðêè.** Java åñëè êëàññ îïèñàí â òîì æå ïàêåòå (òîé æå ñáîðêå C#), òî îí èìååò äîñòóï, èíà÷å - íåò.Êàê âèäíî, ïðàâèëà óñëîæíèëèñü, íî ïîíÿòèÿ äðóãà áîëüøå íå òðåáóåòñÿ. Delphi åñòü 3 êëþ÷åâûõ ñëîâà (ðàáîòàþò êàê ïåðåêëþ÷àòåëè) - public, private, protected.
 ñëó÷àåîïèñàíèÿ êëàññà èñïîëüçóåòñÿ îáúÿâëåíèÿ ïî óìîë÷àíèþ.Äîñòóï ïî óìîë÷àíèþ ñîâïàäàåò ñ ïàêåòíûì äîñòóïîì C# è Java.typeMyClass = classîáúÿâëåíèÿ ïî óìîë÷àíèþÒàê êàê íåò êëþ÷åâîãî ñëîâà - òî äîëæíû ðàçìåùàòüñÿ â íà÷àëå. Ïàêåòíûé äîñòóï - public äëÿ ñâîåãîìîäóëÿ, private äëÿ äðóãèõ. Åñòü òàê æå êëþ÷åâîå ñëîâî published - àíàëîã private, íî âèäíû â âèçóàëüíîìðåäàêòîðå ðåñóðñîâ.Àáñòðàêòíûé òèï äàííûõ - òèï äàííûõ, ñ êîòîðûì ìîæíî ðàáîòàòü òîëüêî ÷åðåç îïðåäåëåííûé èíòåðôåéñ.Ñ òî÷êè çðåíèÿ êëàññà, àáñòðàêòíûé òèï äàííûõ - êëàññ, ó êîòîðîãî íåò ïóáëè÷íûõ ÷ëåíîâ äàííûõ.Åñòü ïîíÿòèå ðåôàêòîðèíãà - èçìåíåíèå êîäà ïðîãðàììû áåç èçìåíåíèÿ åãî ðàáîòû. Çàäà÷à ðåôàêòîðèíãà- óëó÷øåíèå êà÷åñòâà êîäà.×òîá ñäåëàòü êëàññ ïî íàñòîÿùåìó àáñòðàêòíûì, òðåáóåòñÿ ïîçàáîòèòüñÿ î ñìûñëå îïåðàöèè èíèöèàëèçàöèè, êîïèðîâàíèÿ, ïðèñâàèâàíèÿ.Ôóíäàìåíòàëüíûì ïîíÿòèåì ÎÎÏ ÿâëÿåòñÿ ïîíÿòèå àáñòðàêòíîãî òèïà äàííûõ è àáñòðàêòíîãî êëàññà.Êëàññ ÿâëÿåòñÿ òèïîì äàííûõ, íî àáñòðàêòíûé êëàññ íå ÿâëÿåòñÿ àáñòðàêòíûì òèïîì äàííûõ.Ðàçíîâèäíîñòüþ àáñòðàêòíîãî òèïà äàííûõ ÿâëÿåòñÿ ïîíÿòèå èíòåðôåéñà.
Èíòåðôåéñ - ïðîñòî ïåðå÷èñëåíèå îïåðàöèé, êîòîðûå ìîæíî âûïîëíÿòü.Ðàññìîòðèì ñåìàíòèêó protected."Íàèâíàÿ ñåìàíòèêà åñëè ÷ëåí ïîìå÷åí êàê protected, òî ê íåìó âîçìîæåí äîñòóï èç ëþáûõ ôóíêöèé ÷ëåíîâ.class X{private:int i;void f() {i = 0;}};class Y:public X{public:void f(){i = 0;}//Îøèáêàvoid g(X& x) {x.i = 0}//Îøèáêà};//=========================================class X{protected:58int i;void f() {i = 0;}};class Y:public X{public:void f(){i = 0;}//Correctvoid g(X& x) {x.i = 0}//ERROR};Èòàê, åñëè ÷ëåí îáúÿâëåí êàê protected â base, òî ôóíêöèè - ÷ëåíå ïðîèçâîäíîãî êëàññà âîçìîæåí äîñòóï÷åðåç ññûëêó íà ýòîò æå êëàññ,èëè ïðîèçâîäíûé îò íåãî.class Z:private X{};Y y;Z z;y.f (z);//Äîñòóï îòêðûò.Êàæäûé êëàññ, ïðè îáúÿâëåíèè ïðàâ äîñòóïà, îáúÿâëÿåò êîíòðàêò. Private - âñå ýòî êëàññ îñòàâëÿåò çàñîáîé.Public - âñå îòêðûâàåò. Protected - ïðîèçâîäíûì ÷ëåíàì ìîæíî ìåíÿòü êîíòðàêò.Äîïîëíèòåëüíûé ñâîéñòâà êëàññîâ.Ñïåöèàëüíûé ôóíêöèè.Ñïåöèàëüíûå ôóíêöèè - î íèõ êîìïèëÿòîð çíàåò ÷òî - òî äîïîëíèòåëüíîå è ñïîñîáåí ñàì âñòàâëÿòü âûçîâûòàêèõ ôóíêöèé íåÿâíî.Ïóíêò 3.
Ñîçäàíèå è óíè÷òîæåíèå îáúåêòîâ (êëàññîâ).Ïðè ñîçäàíèè îáúåêòà âñåãäà âûçûâàåòñÿ îñîáàÿ ôóíêöèÿ - êîíñòðóêòîð. Êîíñòðóêòîð ìîæåò áûòü ïóñòûì, òîãäà åãî âûçîâ ìîæåò áûòü îïóùåí êîìïèëÿòîðîì. Delphi, Java, C# èñêëþ÷èòåëüíî ðåôåðåíöèàëüíàÿ ìîäåëü îáúåêòà.  Ñ++ îáúåêòû äåëÿòñÿ ïî êëàññóïàìÿòè íà 3 òèïà - ñòàòè÷åñêèå, êâàçèñòàòè÷åñêèå è äèíàìè÷åñêèåC++class X{X (){}};C#, Javaclass X{X (){}} Delphi âñå íåñêîëüêî èíà÷å, òàì êîíñòðóêòîð - ïðîöåäóðà ñ ïðîèçâîëüíûì èìåíåì, ïîìå÷åííàÿ êàê constructor.type X = classconstructor Load; Delphi êîíñòðóêòîðû íàñëåäóþòñÿ, êàæäûé îáúåêò èìååò â êà÷åñòâå ïðåäêà îáúåêò êëàññà Object, êîòîðûé èìååò êîíñòðóêòîð create.X a; âûçîâ êîíñòðóêòîðà ïî óìîë÷àíèþ.X a();ïðîòîòèï ôóíêöèè.Âîçìîæíî è òàêX px = new X; Ñ++ îáúåêò ìîæåò áûòü îáúÿâëåí êàê ïîä-îáúåêò.
Äëÿ ñòàòè÷åñêèõ îáúåêòîâ - ïàðàìåòðû ïåðåäàþòñÿâ â âûçîâå êîíñòðóêòîðà, äëÿ äèíàìè÷åñêèõ - ÷åðåç îïåðàòîð new.X px = new X; Ñ# è Java åäèíñòâåííûé ìåòîä ñîçäàíèå îáúåêòà - newpx = new X;Âîïðîñ - èíèöèàëèçàöèÿ ïîä-îáúåêòîâ îáúåêòà.  Ñ++ îíè èíèöèàëèçèðóþòñÿ â êîíñòðóêòîðå, ïðè÷åìåñëè ÿâíî íå óêàçàííû êîíñòðóêòîðû ïîä-îáúåêòîâ, òî âûçûâàåòñÿ êîíñòðóêòîð ïî óìîë÷àíèþ.class Y;class X{Y y;};59Òàêèì îáðàçîì, íåîáõîäèìî îáåñïå÷èòü âûçîâ êîíñòðóêòîðà áàçîâîãî êëàññà è êîíñòðóêòîðîâ ïîä-îáúåêòîâ.Ýòî äåëàåòñÿ â êîíñòðóêòîðå áàçîâîãî êëàññà.class Y;class X:public Base{Y y;X (){}};Ïðè âûçîâå êîíñòðóêòîðà êëàññà X áóäåò ïðîèçâåäåí âûçîâ êîíñòðóêòîðà êëàññà Base è Y.Ðàññìîòðèì ÿçûê C#class X: Base{Y a;X (){}}; Ñ++ ñíà÷àëà âûçûâàåòñÿ êîíñòðóêòîð áàçîâîãî êëàññà, ïîòîì êîíñòðóêòîðû ïîä-îáúåêòîâ, è òîëüêîïîòîì òåëî êîíñòðóêòîðà.
 C# êîíñòðóêòîðû ïîä-îáúåêòîâ íå âûçûâàþòñÿ (ïî óìîë÷àíèþ áóäåò nil). Íî äëÿòèïîâ çíà÷åíèé áóäåò âûçâàí êîíñòðóêòîð ïî óìîë÷àíèþ (êîòîðûé äëÿ ñòðóêòóð íåëüçÿ ïåðåîïðåäåëèòü).Äëÿ Base áóäåò âûçâàí êîíñòðóêòîð ïî óìîë÷àíèþ.È â Java è â C# åñòü ìåõàíèçì èíèöèàëèçàòîðîâ, òî åñòü âîçìîæíî íàïèñàòü.class X: Base{Y a = new Y();X (){}}; Ñ++ â ñëó÷àå íåæåëàíèÿ (íåâîçìîæíîñòè) âûçîâà êîíñòðóêòîðà ïî óìîë÷àíèþ òðåáóåòñÿ èñïîëüçîâàòüñïèñîê èíèöèàëèçàöèè.<êîíñòðóêòîð>::=èìÿ_êëàññà ([àðãóìåíòû])[:ñïèñîê èíèöèàëèçàöèè]{<òåëî>}X ():Y(0), Base (1){}Ñïèñîê èíèöèàëèçàöèè îòðàáàòûâàåò ðàíüøå òåëà êîíñòðóêòîðà.
Ïðè÷åì, åñëè â ñïèñêå íåò êîíñòðóêòîðîâ íåêîòîðûõ ïîä-îáúåêòîâ, òî áóäóò âûçâàíû êîíñòðóêòîðû ïî óìîë÷àíèþ. C# è Java âûçîâ êîíñòðóêòîðà ïî óìîë÷àíèþ áûë ñâåäåí äî âûçîâà êîíñòðóêòîðà òîëüêî áàçîâîãîêëàññà.C#X():this (0), base (-1)Base (-1) - âûçîâ êîíñòðóêòîðà áàçîâîãî êëàññà (îòëè÷íîãî îò êîíñòðóêòîðà ïî óìîë÷àíèþ). This (0) - äëÿïîä-îáúåêòà. Java:class X extends Base{X(){super (0)// âûçîâ êîíñòðóêòîðà áàçîâîãîthis (-1)}Ýòî äîëæíû áûòü îáÿçàòåëüíî ïåðâûìè îïåðàòîðàìè êîíñòðóêòîðà.Âñå êîíñòðóêòîðû âûçûâàþòñÿ íà÷èíàÿ ñ ñàìîãî áàçîâîãî.  Ñ++ ñíà÷àëà âûçûâàåòñÿ êîíñòðóêòîð áàçîâîãî êëàññ, ïîòîì êîíñòðóêòîðû ïîä-êëàññîâ è òîëüêî ïîòîì òåëî êîíñòðóêòîð îñíîâíîãî îáúåêòà.Òàêèì îáðàçîì, íåëüçÿ âûçûâàòü âèðòóàëüíûå ìåòîäû â êîíñòðóêòîðå â Ñ++, íî ýòî âîçìîæíî â Java èC#C#class X:Base {Z z = new Y();X();60}Z -> Y -> Base -> XC++class Base {Y y;Base ();};class X:Base {Z z;X();};Y -> Base -> Z -> X Ñ++ äîïîëíèòåëüíî ïîÿâëÿþòñÿ êîíñòðóêòîðû êîïèðîâàíèÿ.X (const X&) {...}Êàêîé ñïèñîê èíèöèàëèçàöèè áóäåò ñãåíåðèðîâàí.
Áóäåò âûçâàí êîíñòðóêòîð óìîë÷àíèÿ. Ýòî ïàðàäîêñàëüíî, òàê êàê êîíñòðóêòîð êîïèðîâàíèÿ ïî óìîë÷àíèþ ïðîèçâîäèò ïî÷ëåííîå êîïèðîâàíèå ïîä-÷ëåíîâ.X (const X&):base (x) {...} ÿâíûé âûçîâ. C# è Java íåò êîíñòðóêòîðà êîïèðîâàíèÿ (èáî ðåôåðåíöèàëüíàÿ ìîäåëü äàííûõ). Òàê äå â íèõ íåòêîíñòðóêòîðà ïðåîáðàçîâàíèÿ, òàê êàê â Java çàïðåùåíû íåÿâíûå ïðåîáðàçîâàíèÿ, à â C# îíè îïèñûâàþòñÿñ ïîìîùüþ ñòàòè÷åñêèõ ìåòîäîâ.61Ëåêöèÿ 2425.11.2008Ðàññìîòðèì ÿçûê Delphi - òàì íàèáîëåå ïðîñòàÿ ñèòóàöèÿ. Òàì íàñëåäóþòñÿ êîíñòðóêòîðû è äåñòðóêòîðû.Áîëåå òîãî, îíè âñåãäà âûçûâàþòñÿ ÿâíî, òî åñòü òàì íåò îñîáûõ ôîðì êîíñòðóêòîðîâ.type X = classconstructor load;destructor Destroy;end;Åñëè êîíñòðóêòîðîâ èëè äåñòðóêòîðîâ íåò, òî îíè íå ñîçäàþòñÿ. Òàê êàê êîíñòðóêòîðû íàñëåäóþòñÿ, òîâñå îáúåêòû èìåþò êîíñòðóêòîð create è äåñòðóêòîð destroy. Êîãäà âûçûâàåòñÿ êîíñòðóêòîð, ìû óâåðåíû÷òî òàáëèöà âèðòóàëüíûõ ìåòîäîâ èìååò êîððåêòíûé âèä (â Ñ++ ýòî íå òàê).Èòàê êîíñòðóêòîðû è äåñòðóêòîðû íàñëåäóþòñÿ íî íå ãåíåðèðóþòñÿ.
Íèêàêèõ êîíñòðóêòîðîâ óìîë÷àíèÿíåòó è äëÿ âûçîâà êîíñòðóêòîðà áàçîâîãî êëàññà òðåáóåòñÿ âûçûâàòü åãî ÿâíî. Äëÿ ýòîãî ñëóæèò ñïåöèàëüíîå êëþ÷åâîå ñëîâîinherited - Delphisuper - javabase - C# Delphi äëÿ âûçîâà êîíñòðóêòîðà áàçîâîãî êëàññà òðåáóåòñÿ ïåðâûì îïåðàòîðîì â îáúåêòå íàïèñàòüinherited Create. Ïðè ýòîì ýòî äîëæåí áûòü èìåííî ïåðâûì îïåðàòîðîì â êîíñòðóêòîðå, òàê êàê êîíñòðóêòîðcreate çàáèâàåò îáúåêò íóëÿìè. Äëÿ ïîëó÷åíèÿ ðàçìåðà îáúåêòà, create èñïîëüçóåò âèðòóàëüíóþ ôóíêöèþïîëó÷åíèÿ ðàçìåðà îáúåêòà.Âàæíî ÷òî èìÿ îáúåêòà íå èñïîëüçóåòñÿ, òî åñòü ïðè ñìåíå èìåíè íå òðåáóåòñÿ ïåðåïèñûâàòü íàñëåäóåìûéêëàññ. Delphi íåò àâòîìàòè÷åñêîé ñáîðêè ìóñîðà â îáùåì âèäå, íî ïðè ðàáîòå ÷åðåç ñòàíäàðòíûå èíòåðôåéñûîíà ìîæåò áûòü.
Ýòî ïðèâîäèò ê òîìó, ÷òî ïðîãðàììû íà Delphi Ïðîâîöèðóþò áîëüøîå ÷èñëó óòå÷åê ïàìÿòè.var a: X;a := X.create;a := X.Create (1);a.Free; - íå äåñòðóêòîð, íî óíè÷íîæåíèå îáúåêòà, êîòîðûé ìîæåò âûçûâàòü äåñòðóêòîð.Äåñòðóêòîð íå òðåáóåòñÿ ÿâíî âûçûâàòü ÿâíî, òàê êàê ôóíêöèÿ Free íå òîëüêî âûçûâàåò äåñòðóêòîð, íîè âûçûâàåò ìåíåäæåð ïàìÿòè äëÿ î÷èñòêè.
Òàê êàê ôóíêöèÿ íå ìîæåò ìåíÿòü çíà÷åíèå self, òî âûçîâ Freeíå ìîæåò èíèöèàëèçèðîâàòü a := nil.Ñòàòè÷åñêèå îáúåêòû Ñ++ âñå ñòàòè÷åñêèå îáúåêòû ñîçäàþòñÿ äî âûçîâà ôóíêöèè main. Ýòî åäèíñòâåííîå ÷òî èçâåñòíî ïðîíåãî.X a(0);X b(1);Âñå ÷òî èçâåñòíî, ýòî òî ÷òî a è b áóäóò ñîçäàíû äî âûçîâà main è óäàëåíû ïîñëå âûõîäà èç íåå. Íîïîðÿäîê èõ âûçîâà íå îïðåäåëåí.  îáùåì ñëó÷àå Ñ++ íå äàåò ñïîñîáîâ óïðàâëåíèÿ ïðîöåññîâ èíèöèàëèçàöèèñòàòè÷åñêèõ äàííûõ, è òðåáóåòñÿ èçîáðåòàòü äóðãèå ñïîñîáû. C# è Java âñå íåñêîëüêî èíà÷å.
 Java äëÿ îáúåêòà ìîãóò ñòîÿòü èíèöèàëèçàòîðû.class X{static Y a = new Y ();}//Javaclass X{static int []a;static {a = new int [N];for (int i = 0; i < N; i ++) a[i] = i;}}62 C# åñòü âîçìîæíîñòü ïðîñòîé ñòàòè÷åñêîé èíèöèàëèçàöèè, à òàê æå åñòü ñòàòè÷åñêèé êîíñòðóêòîð ïîëíûé àíàëîã ñòàòè÷åñêîãî áëîêà â Java. Ïðè ýòîì ýòî äîëæåí áûòü êîíñòðóêòîðîì ïî óìîë÷àíèþ. Delphi ñòàòè÷åñêèé îáúåêòîâ âîîáùå íåò.