лекции (2008) (by Kravets) (укороченное) (1160827), страница 15
Текст из файла (страница 15)
Äîïóñòèì êîìïèëÿòîð âñòðå÷àåòimport serviceè ïîäãðóæàåò òàáëèöó èìåí, è òóò âûÿñíÿåòñÿ ÷òî åñòüTYPE HANDLER;ïîñëå ÷åãî êîìïèëÿòîð âèäèòVAR H:HANDLER;Äðóãîé èíôîðìàöèè ó íåãî íåò, òî åñòü îí íå ìîæåò ïðîèçâåñòè ðàñïðåäåëåíèÿ ïàìÿòè. Ïîýòîìó áûëî ââåäåíîîãðàíè÷åíèå, ÷òî ýòî ìîæåò áûòü ëèáî öåëûé òèï, ëèáî óêàçàòåëü, òî åñòü èìååò ìåñòî èñêëþ÷èòåëüíîðåôåðåíöèàëüíàÿ ñòðóêòóðà.Ñîçäàòåëè ÿçûêà Àäà ïîíèìàëè ýòó ïðîáëåìó.  Àäå àáñòðàêòíûé òèï äàííûõ - äåéñòâèòåëüíî àáñòðàêòíûé òèï. Ñóùåñòâóåò 2 êîíöåïöèè - ïðèâàòíûå òèï äàííûõ è îãðàíè÷åííûå ïðèâàòíûé òèï äàííûõ.Îñíîâíîé íåäîñòàòîê ñ òî÷êè çðåíèÿ èíêàïñóëÿöèè - òðåáîâàíèå óïîòðåáëÿòü èñêëþ÷èòåëüíî ðåôåðåíöèàëüíóþ ìîäåëü äàííûõ.Ðàññìîòðèì ïðèìåð íà ÿçûêå Àäàpublic Stacks istype Stack is private;-- îïåðàöèè íàä ñòåêîìprocedure push (S:inout stack, X:integer);procedure pop (S:inout stack, X:out integer);private:type stack is recordtop:integer := 0;body: array (0..N) of integer;end record;end Stacks ßçûêå Àäà ïîáî÷íûé ýôôåêò îò ôóíêöèé çàïðåùåí, òî åñòü íåëüçÿ îôîðìèòü POP êàê ôóíêöèþ.
Åñëèõîòÿ áû îäèí èç òèïîâ äàííûõ îáúÿâëåí êàê ïðèâàòíûé, òî â ñïåöèôèêàöèè ïàêåòà ïîÿâëÿåòñÿ äîïîëíèòåëüíàÿ ïðèâàòíàÿ ÷àñòü, ãäå äîëæíà áûòü ðàñïèñàíà ñòðóêòóðà òèïà.Òåïåðü âîçìîæíî èñïîëüçîâàòü ìåòîäû ïðèâàòíîãî òèïà, íî äîñòóï ê åãî çàêðûòûì ñòðóêòóðàì çàïðåùåí.Push (S,1);Pop (S,X);S.top := 1; Îøèáêàtype PLINK is access;type link is record52next: PLINK;X: integer;end record;type PLINK is access link; ïðèâàòíîé ÷àñòè îïèñûâàþòñÿ âñå ñòðóêòóðû, íóæíûå äàííîìó îáúåêòû. Åå ïîëíîñòüþ âèäèò êîìïèëÿòîð, íî îíà íå äîñòóïíà ïðîãðàììèñòó. Òî åñòü, ÷òîáû çàìåíèòü ðåàëèçàöèþ ñòåêà ñ ìàññèâà íà ñïèñîê, òîñëåäóåò äîáàâèòü â òåêñòtype Stack is access PLINK;Òåïåðü íåîáõîäèìî ïåðåòðàíñëèðîâàòü âñå ìîäóëè, êîòîðûå èñïîëüçóþò ýòîò òèï äàííûõ. Òàêîé òèï äàííûõ íå ÿâëÿåòñÿ ïîëíîñòüþ àáñòðàêòíûì.
Ïî ñðàâíåíèþ ñ Ìîäóëà - 2 ê äàííîìó òèïó ïðèìåíèìû îïåðàöèèïðèñâàèâàíèÿ è ñðàâíåíèÿ.Êàê âèäíî, â ñëó÷àå ïåðâîé ðåàëèçàöèè ñòåêà ñòàíäàðòíîå ïðèñâàèâàíèå è ñðàâíåíèå íà ðàâåíñòâî (ïîâåðõíîñòíûå îïåðàöèè) ðàáîòàþò êîððåêòíî, êîãäà êàê â âòîðîì ñëó÷àå ýòè îïåðàöèè ìîãó áûòü íåêîððåêòíûìè.Äëÿ ðåøåíèÿ ýòîé ïðîáëåìû áûëè ââåäåíû îãðàíè÷åííûå ïðèâàòíûå òèïû äàííûõ.type T is limited privateÒåïåðü ê ýòîìó òèïó ïðèìåíèìû òîëüêî òå îïåðàöèè, êîòîðûå îïèñàíû â ñàìîì ïàêåòå.ÎáåðîíRecordtop:Integer;body:ARRAY N OF INTEGER;END;TYPE Stack=RECORDEND;Ðåàëèçàöèÿ â Îáåðîíå íå óñòóïàåò â òî÷êè çðåíèÿ ñêîðîñòè ðåàëèçàöèè Ìîäóëà - 2, íî óëó÷øàåò ãèáêîñòüÿçûêà. Íî Âèðò îòîøåë îò ïðèíöèïà ÐÎÐÈ, òî åñòü ñîâìåùåíû îïðåäåëåíèÿ è ðåàëèçàöèÿ.Ïðè÷èíîé ýòîãîñòàëà óâåðåííîñòü âèðòà â òîì, ÷òî ïðîãðàììèðîâàíèÿ íà Îáåðîíå âñåãäà áóäåò ïðîèñõîäèòü â íåêîòîðîéñðåäå ïðîãðàììèðîâàíèÿ.Òî åñòü ïðèíöèï ðàçäåëåíèÿ îïðåäåëåíèÿ è ðåàëèçàöèè áûë ïåðåëîæåí íà äîêóìåíòèðóþùèå ñèñòåìû.
ÂC# è Java òà æå ñõåìà.Èòàê ðàçäåë ïðî èíêàïñóëÿöèþ çàêîí÷åí.Ãëàâà 6Êëàññ. Îïðåäåëåíèå íîâîãî òèïà äàííûõ ñ ïîìîùüþ êëàññîâ.Êëàññ - ýòî âñåãäà íîâûé òèï äàííûõ. Êëàññ ìîæåò áûòü ðåàëèçîâàí â ñòàíäàðòíîé áèáëèîòåêå èëè âñòðîåíâ êîìïèëÿòîð. Íàïðèìåð â .NET êëàññû Object è String âñòðîåíû â êîìïèëÿòîð.Ìîäóëü ÿâëÿåòñÿ áîëåå óíèâåðñàëüíûì ïîíÿòèåì ÷åì êëàññ. Íàïðèìåð â Ñ++ âñå ÷òî ïðèíàäëåæèòêëàññó, ñîäåðæèòñÿ â this.
 Ñ# ìîæíî ââîäèòü îïåðàòîðû ïðåîáðàçîâàíèÿ äëÿ ñîîòâåòñòâóþùåãî êëàññà. ÂÑ++ ýòî ðåøàëîñü ñ ïîìîùüþ îïåðàöèè ïðåîáðàçîâàíèÿ, êîòîðàÿ ÿâëÿëàñü ÷ëåíîì êëàññà Ò1 è ïðèâîäèëàê êëàññó Ò2. Ñ# ýòî ðåàëèçîâàíî ñ ïîìîùüþ ñòàòè÷åñêèõ ôóíêöèé ÷ëåíîâ ëèáî Ò1 ëèáî Ò2. Ñ# è Java îòñóòñòâóþò ãëîáàëüíûå ôóíêöèè. Èõ çàìåíÿþò ñòàòè÷åñêèõ ôóíêöèè çàêðûòûõ êëàññîâ.Åãî íåëüçÿ íàñëåäîâàòü è îáúåêò òàêîãî êëàññà íåëüçÿ ïîðîäèòü. Òî åñòü ýòî ÿâëÿåòñÿ íå êëàññîì, à ñêîðååìîäóëåì.  Ñ# åñòü ïîíÿòèå ñòàòè÷åñêîãî êëàññà - ïîëíûé àíàëîã ìîäóëÿ. Òàêèì îáðàçîì, ìîäóëü áîëååóíèâåðñàëåí, íî ìåíåå óäîáåí.Ïóíêò 1. ×ëåíû êëàññà.class name: íàñëåäîâàíèå{ñïèñîê ÷ëåíîâ};Òàêîé ñèíòàêñèñ ïðèñóòñòâóåò â Java, C#, C++.
 Ñ#, Java, Delphi åñëè ðîäèòåëü íå óêàçàí, òî ðîäèòåëåì ñ÷èòàåòñÿ êëàññ Object. Delphi:type name = class (íàñëåäîâàíèå)53ñïèñîê ÷ëåíîâ-äàííèõend;C++ è Delphi ïîääåðæèâàþò ïðèíöèï ÐÎÐÈ.  Ñ++ ìû ìîæåò îïèñûâàòü òåëî ôóíêöèè âíóòðè òåëàêëàññà, ÷òî ïîçâîëÿåò êîìïèëÿòîðó ñäåëàòü ôóíêöèþ âñòðàèâàåìîé.  Delphi çàïðåùåíî îïèñûâàòü òåëîôóíêöèè â îïèñàíèè è èíòåðôåéñà êëàññà.class X{int i;void f(int);};void X::f(int){..}Delphi:type T = classprocedure P;end;procedure T.P;beginend;Ïóíêò 1. ×ëåíû êëàññîâ.-÷ëåíû-äàííûå-÷ëåíû-ôóíêöèè-÷ëåíû-òèïûÂñå ÷ëåíû êëàññà ìîæíî ðàçäåëèòü íà ñòàòè÷åñêèå è íå ñòàòè÷åñêèå.Íå ñòàòè÷åñêèå ÷ëåíû - äàííûå îáîáùåíèå ïîíÿòèå ÷ëåíà çàïèñè.
Îáðàùåíèå ê íèì èäåò <èìÿ îáúåêòà>.<èìÿ ÷ëåíà>.  Ñ++ òàê æå åñòü îïåðàöèÿ ->.Ñòàòè÷åñêèå ÷ëåíû - äàííûå ñ òî÷êè çðåíèÿ ðàñïðåäåëåíèÿ ïàìÿòè - ãëîáàëüíûå ïåðåìåííûå.  Ñ++Äîñòóï ê íèì ïî èìåíè êëàññà C::i.  C# è Java, C.i.  Ñ++ ìîæíî îáðàùàòüñÿ ê ñòàòè÷åñêèì ÷ëåíàì è÷åðåç îáúåêò êëàññà.54Ëåêöèÿ 2218.11.2008Äëÿ ñòàòè÷åñêèõ ÷ëåíîâ êëàññà èìÿ êëàññà âûñòóïàåò êàê èìÿ ìîäóëÿ.
Îáðàùåíèå ê ÷ëåíó ïðîñòðàíñòâà èìåí ÷åðåõ èìÿ ïðîñòðàíñòâà èìåí è ê ñòàòè÷åñêîìó ÷ëåíó êëàññà ÷åðåç èìÿ êëàññà ñèíòàêñè÷åñêèýêâèâàëåíòíû.Ðàññìîòðèì ðàñïðåäåëåíèå ïàìÿòè. Äëÿ íåñòàòè÷åñêèõ ÷ëåíîâ ïîìÿòü îòâîäèòñÿ òàì æå, ãäå è è ïàìÿòüäëÿ îáúåêòà êëàññà. Ñî ñòàòè÷åñêèìè ÷ëåíàìè ñîâñåì äðóãàÿ ñèòóàöèÿ.  C# è Java ïàìÿòü îòâîäèòñÿñèñòåìîé â ñåãìåíòå äàííûõ.  Ñ++ ñàì ïðîãðàììèñò äîëæåí óêàçàòü â êàêîé ôàéëå áóäåò ðàçìåùåí ÷ëåíäàííûõ./*X.h*/class X{static int a;};/*X.cpp*/int X::a; *.h ëó÷øå íå âêëþ÷àòü, òàê êàê âîçìîæíî ïåðåîïðåäåëåíèå èìåíè.Ïîãîâîðèì î ñòàòè÷åñêèõ è íå ñòàòè÷åñêèå ÷ëåíû - ôóíêöèè.
Íå ñòàòè÷åñêàÿ ôóíêöèÿ - îñîáàÿ ôóíêöèÿ, êîòîðàÿ îòëè÷àåòñÿ ñëåäóþùèìè âåùàìè:1. Êëàññ - îáëàñòü äåéñòâèÿ.(òî åñòü ôóíêöèè ÷ëåíû òðàíñëèðóþòñÿ â êîíòåêñòå ñâîåãî êëàññà)2. Íåÿâíûé ïàðàìåòð (àäðåñ îáúåêòà).  Ñ++ - ýòî this (óêàçàòåëü). C# è Java - this (ññûëêà).  D èSmalltalk - self.Òî åñòüclass X{int i;void f(){this -> i = 0;i = 2;}};Ó êàæäîé ôóíêöèè åñòü íåñêîëüêî îáëàñòåé äåéñòâèÿ.
Òî åñòü òåëî ôóíêöèè ÿâëÿåòñÿ âëîæåííûì ïîîòíîøåíèþ ê òåëó êëàññà. Íàëåäîâàíèå òàê æå äàåò âëîæåííîñòü (ïîòîìêè âëîæåííû â ïðåäêîâ).Îòäåëüíî ðàññìîòðèì ôîðìàëüíûå ïàðàìåòðû.  Delphi ïàðàìåòðû èìåþò îáëàñòü äåéñòâèÿ êëàññà (òîåñòü èõ èìåíà íå ìîãóò ñîâïàäàòü ñ èìåíàìè êëàññà).  C/C++ îíè ïðèíàäëåæàò òåëó ôóíêöèè.Äëÿ äîñòóïà ê çàêðûòûì ïîëÿì êëàññà ñëåäóåò èñïîëüçîâàòü óêàçàòåëü this->. Âàðèàíò ðàçðåøåíèÿ êîíôëèêòà èìåí - íàêëàäûâàòü îãðàíè÷åíèÿ íà èìåíà. ñòàòè÷åñêèõ ôóíêöèÿ - ÷ëåíàõ íåëüçÿ îáðàùàòüñÿ ê íåñòàòè÷åñêèì ÷ëåíàì êëàññà ÷åðåç this.
Îáðàùåíèåâîçìîæíî òîëüêî ÷åðåç ÿâíîå óêàçàíèå èìåíè îáúåêòà.Âñå ôóíêöèè-÷ëåíû èìåþò ìàêñèìàëüíûå ïðàâà äîñòóïà ê ÷ëåíàì êëàññà.Äëÿ ñòàòè÷åñêèõ ÷ëåíîâ äàííûõ íåò íèêàêîé ðàçíèöû ìåæäó óêàçàòåëåì íà ãëîáàëüíûå äàííûå è óêàçàòåëåí íà ñòàòè÷åñêèé ÷ëåí êëàññà.int * pi;int a;pi = &a;int X::stat = -1;pi = &X::stat;Àíàëîãè÷íî ñ èìåíàìè ôóíêöèévoid (*pf)(void);pf = X::f;Åñëè ðå÷ü èäåò î óêàçàòåëÿõ íà ÷ëåíû äàííûå, òî âñå íå òàê. int X::* p; - óêàçàòåëü íà ÷ëåí êëàññà X.class X{int i;int y;void f();55};void g();p = &X::i; Òîãäà çäåñü õðàíèòñÿ ñìåùåíèå ïîëÿ i â êëàññå X.p = &X::y; Òîãäà çäåñü õðàíèòñÿ ñìåùåíèå ïîëÿ y â êëàññå X.void (X::*)(void) PFX;PFX = & X::f;PFX = & X::g;X anx;anx.*p;anx.*PFX();px -> p;px -> * PFX ();Âî âñåõ ÿçûêàõ äîïóñêåàòñÿ ðàçìåùàòü êîíñòàíòíûå è íå êîíñòàíòíûå îáúåêòû.const int i;Ýòîò ÷ëåí ÿâëÿåòñÿ êîíòàíòîé è ìîæåò áûòü èíèöèàëèçèðîâàí ïðÿìî â îïðåäåëåíèè (òàê êàê îáúåêòöåëîãî òèïà).
Íî òàêèå ÷ëåíû ìîãóò áûòü òîëüêî static. Èíà÷å ïðèøëîñü áû õðàíèòü íà êàæäûé îáúåêòêëàññà ìíîãî ëèøíèõ äàííûõ. C# åñëè ðå÷ü èäåò î êîíñòàíòå, òî ñëîâî const ãîâîðèò î òîì, ÷òî âûðàæåíèå ìîæåò áûòü âû÷èñëåííîñòàòè÷åñêè è ÷òî îáúåêò ÿâëÿåòñÿ ñòàòè÷åñêèì. Òàê æå â C# åñòü ìîäèôèêàòîð readonly. Îí ñïåöèôèöèðóåòòî, ÷òî ïîñëå èíèöèàëèçàöèè îáúåêòà îí íå ìîæåò ïîòåðÿòü ñâîå çíà÷åíèå, íî îí íå îáÿçàí áûòü ñòàòè÷åñêèìè ìîæåò áûòü èíèöèàëèçèðîâàí ëþáûì âûðàæåíèåì âî âðåìÿ âûïîëíåíèÿ.Ïåðåéäåì ê òðåòüåìó âàðèàíòó äàííûõ - òèïàì.class X{class Y{};};Íàïðèìåð:STLvector{iterator{};}; Java âíóòðåííèé êëàññ - íåñòàòè÷åñêèé âëîæåííûé êëàññ.
Ñòàòè÷åñêèé âëîæåííûé êëàññ - îáû÷íûéâëîæåííûé êëàññ. Âíóòðåííèé êëàññ î÷åíü ãëóáîêî ñâÿçàí ñ îáúåìëþùèì êëàññîì. Íàïðèìåð ëþáîé îáúåêòâëîæåííîãî êëàññà èìååò ññûëêó íà îáúåêò îáúåìëåùåãî êëàññà.class BankAccount{int Account;class Action{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}56}}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;ÈíêàïñóëÿöèÿÑëåäóåò ðàçëè÷àòü óïðàâëåíèå äîñòóïîì è óïðàâëåíèå âèäèìîñòüþ. Ñ++ åñòü âñåãî 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 +57Ëåêöèÿ 2320.11.2008 Ñ++ ñòðóêòóðû ïî óìîë÷àíèþ èìåþò ïðàâà äîñòóïà public.  Ñ++ âñå îòëè÷èÿ ñòðóêòóð îò êëàññîâçàêëþ÷àþòñÿ òîëüêî â ïðàâàõ äîñòóïà ïî óìîë÷àíèþ. Êëàññ æå ïî óìîë÷àíèþ èìååò ïðàâà äîñòóïà private.Ïðàâèëà Ñ++ áûëè íå óäîáíû äëÿ ðàáîòû ñ ïîíÿòèåì ìîäóëÿ (íàáîðà ðåñóðñîâ).