лекции (2008) (by Kravets) (1160829), страница 16
Текст из файла (страница 16)
Âíóòðåííèé êëàññî÷åíü ãëóáîêî ñâÿçàí ñ îáúåìëþùèì êëàññîì. Íàïðèìåð ëþáîé îáúåêòâëîæåííîãî êëàññà èìååò ññûëêó íà îáúåêò îáúåìëåùåãî êëàññà.class BankAccount{int Account;class Action{93}int k;void f(){k,account}}BankAccount X;BankAccount.Action a = X.new Action();Âíóòðè êëàññà BankAccount ìîæíî ïèñàòü êîðî÷åclass BankAccount{int Account;class Action{int k;void f(){k,account}}void dept (){Action depth = new Action ();}} Ñ# òîæå åñòü ïîíÿòèå ñòàòè÷åñêîãî êëàññà. Ïðè ýòîì íåñòàòè÷åñêèé êëàññ C# - ýòî àíàëîã ñòàòè÷åñêîãî êëàññà ÿçûêà Java È îáû÷íîãîâëîæåííîãî êëàññà ÿçûêà Ñ++.
Åñëè æå êëàññ ÿâëÿåòñÿ ñòàòè÷åñêèì, òîîí ìîæåò ñîäåðæàòü òîëüêî ñòàòè÷åñêèå ÷ëåíûå äàííûõ è ñòàòè÷åñêèåôóíêöèè.Íàïðèìåð êëàññ math, ñîäåðæàùèé îïðåäåëåíèÿ ìàòåìàòè÷åñêèõ ôóíêöèé è ìàòåìàòè÷åñêèõ êîíñòàíò.Ñòàòè÷åñêèé êëàññ íåëüçÿ íàñëåäîâàòü. ÿçûêå Delphi íåò ïîíÿòèÿ âëîæåííûõ êëàññîâ è ñòàòè÷åñêèõ ôóíêöèé è ïðîöåäóð.unit M;interfacefunction GLB (a : integer):integer;type X = char;vari: integer;constructor ();procedure t;implementationend;94ÈíêàïñóëÿöèÿÑëåäóåò ðàçëè÷àòü óïðàâëåíèå äîñòóïîì è óïðàâëåíèå âèäèìîñòüþ.ÂÑ++ åñòü âñåãî 3 óðîâíÿ äîñòóïà - public (ëþáàÿ ôóíêöèÿ èìååò äîñòóï), protected (òîëüêî îáúåêòû ïîòîìêè) è private (òîëüêî ôóíêöèè ÷ëåíû).T operator+(const T&, const T&);T T::operator+(const T&);T& T::operator+=(const T&);T operator+(const T& t1, const T& t2){T temp = t1;return temp += t2;}friend void f();friend void V::g (T&);friend class Z;Äðóæáà íå íàñëåäóåòñÿ, îíà íå òðàíçèòèâíà è íå ìîæåò áûòü ïîëó÷åíà. Java åñòü ÷åòâåðòàÿ êàòåãîðèÿ îáëàñòåé äîñòóïà - ïàêåò.
Òî åñòüôóíêöèè èç êëàññîâ, íàõîäÿùèõñÿ â òìî æå ïàêåòå.  Ñ# âìåñòî ïàêåòà- assembly.Ñîîòâåòñòâåííî åñòü è 4 ìåòîäà äîñòóïà.public ++++protected +++internal +±+private +95Ëåêöèÿ 2320.11.2008 Ñ++ ñòðóêòóðû ïî óìîë÷àíèþ èìåþò ïðàâà äîñòóïà public.  Ñ++âñå îòëè÷èÿ ñòðóêòóð îò êëàññîâ çàêëþ÷àþòñÿ òîëüêî â ïðàâàõ äîñòóïàïî óìîë÷àíèþ. Êëàññ æå ïî óìîë÷àíèþ èìååò ïðàâà äîñòóïà private.Ïðàâèëà Ñ++ áûëè íå óäîáíû äëÿ ðàáîòû ñ ïîíÿòèåì ìîäóëÿ (íàáîðà ðåñóðñîâ). ßçûêè â êîòîðûõ åñòü ïîíÿòèÿ ìîäóëÿ (Delphi, Java, C#)èìåþò îñîáûå ñïåöèôèêàöèè äîñòóïà äëÿ îáúåêòîâ èç òîãî æå ìîäóëÿ. Java åñòü ïîíÿòèå ïàêåòà (íå ïóòàòü ñ ïàêåòîì Àäà). Package - åäèíèöà óïðàâëåíèÿ êîíòåêñòîì è åäèíèöà äèñòðèáóöèè. Ñ# namespace - åäèíèöà óïðàâëåíèÿ êîíòåêñòîì, ñáîðêà - åäèíèöàóïðàâëåíèå äèñòðèáóöèåé. Ïðè ýòîì ñáîðêà - ýòî íå ïîíÿòèå óðîâíÿ ÿçûêà.
Òî åñòü íåò êëþ÷åâîãî ñëîâà assembly, íî êîãäà ïðîèñõîäèò ñáîðêà,òî îíà ïîìåùàåòñÿ èìåííî â assembly. Java ïîÿâëÿåòñÿ ïàêåòíûé äîñòóï (ìîäèôèêàòîðà íåò, ÿâëÿåòñÿ äîñòóïîì ïî óìîë÷àíèþ).  C# ïîíÿòèå internal (äîñòóï äëÿ âñåõ êëàññîâèç òîé æå ñáîðêè).Ïî óìîë÷àíèþ â C# - private.ñâîépublic+protected +internal +private+ïîòîìîê ïðîèçâîäíûé ìèð(÷óæîé)+++++*+**+-* Java protected ÿâëÿåòñÿ è ïàêåòíûå äîñòóï.  C# åñëè protected,òî äîñòóï òîëüêî èç ïðîèçâîäíûõ. C# åñòü äâîéíîé ìîäèôèêàòîð, òîåñòü protected internal - äîñòóï è äëÿ ïîòîìêîâ è äëÿ îáúåêòîâ òîé æåñáîðêè.** Java åñëè êëàññ îïèñàí â òîì æå ïàêåòå (òîé æå ñáîðêå C#), òîîí èìååò äîñòóï, èíà÷å - íåò.Êàê âèäíî, ïðàâèëà óñëîæíèëèñü, íî ïîíÿòèÿ äðóãà áîëüøå íå òðåáóåòñÿ. Delphi åñòü 3 êëþ÷åâûõ ñëîâà (ðàáîòàþò êàê ïåðåêëþ÷àòåëè) public, private, protected.
 ñëó÷àå îïèñàíèÿ êëàññà èñïîëüçóåòñÿ îáúÿâëåíèÿ ïî óìîë÷àíèþ.Äîñòóï ïî óìîë÷àíèþ ñîâïàäàåò ñ ïàêåòíûì äîñòóïîì C# è Java.typeMyClass = classîáúÿâëåíèÿ ïî óìîë÷àíèþ96Òàê êàê íåò êëþ÷åâîãî ñëîâà - òî äîëæíû ðàçìåùàòüñÿ â íà÷àëå.Ïàêåòíûé äîñòóï - 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:int i;void f() {i = 0;}};class Y:public X{public:void f(){i = 0;}//Correctvoid g(X& x) {x.i = 0}//ERROR};97Èòàê, åñëè ÷ëåí îáúÿâëåí êàê 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;98 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;};Òàêèì îáðàçîì, íåîáõîäèìî îáåñïå÷èòü âûçîâ êîíñòðóêòîðà áàçîâîãî êëàññà è êîíñòðóêòîðîâ ïîä-îáúåêòîâ. Ýòî äåëàåòñÿ â êîíñòðóêòîðåáàçîâîãî êëàññà.class Y;class X:public Base{Y y;X (){}};Ïðè âûçîâå êîíñòðóêòîðà êëàññà X áóäåò ïðîèçâåäåí âûçîâ êîíñòðóêòîðà êëàññà Base è Y.Ðàññìîòðèì ÿçûê C#class X: Base{Y a;X (){}};99 Ñ++ ñíà÷àëà âûçûâàåòñÿ êîíñòðóêòîð áàçîâîãî êëàññà, ïîòîì êîíñòðóêòîðû ïîä-îáúåêòîâ, è òîëüêî ïîòîì òåëî êîíñòðóêòîðà.
 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)}100Ýòî äîëæíû áûòü îáÿçàòåëüíî ïåðâûìè îïåðàòîðàìè êîíñòðóêòîðà.Âñå êîíñòðóêòîðû âûçûâàþòñÿ íà÷èíàÿ ñ ñàìîãî áàçîâîãî.  Ñ++ñíà÷àëà âûçûâàåòñÿ êîíñòðóêòîð áàçîâîãî êëàññ, ïîòîì êîíñòðóêòîðûïîä-êëàññîâ è òîëüêî ïîòîì òåëî êîíñòðóêòîð îñíîâíîãî îáúåêòà.Òàêèì îáðàçîì, íåëüçÿ âûçûâàòü âèðòóàëüíûå ìåòîäû â êîíñòðóêòîðå â Ñ++, íî ýòî âîçìîæíî â Java è C#C#class X:Base {Z z = new Y();X();}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# îíè îïèñûâàþòñÿ ñïîìîùüþ ñòàòè÷åñêèõ ìåòîäîâ.101Ëåêöèÿ 2425.11.2008Ðàññìîòðèì ÿçûê Delphi - òàì íàèáîëåå ïðîñòàÿ ñèòóàöèÿ.
Òàì íàñëåäóþòñÿ êîíñòðóêòîðû è äåñòðóêòîðû. Áîëåå òîãî, îíè âñåãäà âûçûâàþòñÿÿâíî, òî åñòü òàì íåò îñîáûõ ôîðì êîíñòðóêòîðîâ.type X = classconstructor load;destructor Destroy;end;Åñëè êîíñòðóêòîðîâ èëè äåñòðóêòîðîâ íåò, òî îíè íå ñîçäàþòñÿ. Òàêêàê êîíñòðóêòîðû íàñëåäóþòñÿ, òî âñå îáúåêòû èìåþò êîíñòðóêòîð createè äåñòðóêòîð destroy. Êîãäà âûçûâàåòñÿ êîíñòðóêòîð, ìû óâåðåíû ÷òîòàáëèöà âèðòóàëüíûõ ìåòîäîâ èìååò êîððåêòíûé âèä (â Ñ++ ýòî íå òàê).Èòàê êîíñòðóêòîðû è äåñòðóêòîðû íàñëåäóþòñÿ íî íå ãåíåðèðóþòñÿ. Íèêàêèõ êîíñòðóêòîðîâ óìîë÷àíèÿ íåòó è äëÿ âûçîâà êîíñòðóêòîðàáàçîâîãî êëàññà òðåáóåòñÿ âûçûâàòü åãî ÿâíî. Äëÿ ýòîãî ñëóæèò ñïåöèàëüíîå êëþ÷åâîå ñëîâîinherited - Delphisuper - javabase - C# Delphi äëÿ âûçîâà êîíñòðóêòîðà áàçîâîãî êëàññà òðåáóåòñÿ ïåðâûìîïåðàòîðîì â îáúåêòå íàïèñàòü inherited Create.