лекции (2008) (by Kravets) (1160829), страница 20
Текст из файла (страница 20)
Import <èìÿ ïàêåòà> äåëàåò âñåèìåíà èç ïàêåòà âèäèìûìè. Áîëåå òîãî, ìîæíî è íå èìïîðòèðîâàòü ïàêåò,åñëè äëÿ äîñòóïà ê èìåíè ýòîãî ïàêåòà ÿâíî çàäàòü ïîëíîå èìÿ ïàêåòà.Áîëåå ìîùíîå ñðåäñòâî ÿçûêà Java - ïðîñòðàíñòâà èìåí.124Ëåêöèÿ 289.12.2008Ïðîñòðàíñòâà èìåí Ñ++ åñòü 2 ñòèëÿ - ñòàðûé ñòèëü (äëÿ ñîâìåñòèìîñòè ñî ñòàðûìèïðîãðàììàìè) è íîâûé ñòèëü (íà îñíîâå ïðîñòðàíñòâà èìåí).Òî åñòü âîçìîæíî èñïîëüçîâàòü êàê ñòàðûé ñòèëü ïðîãðàììèðîâàíèÿ<stdio.h>, òàê è íîâûé ñòèëü std::iostream.È Ñ++ è C# ïîääåðæèâàþò âëîæåííîñòü ïðîñòðàíñòâ èìåí.
Ïðèýòîì â C# ñëåäóþùèå îáúÿâëåíèÿ ýêâèâàëåíòíûnamespace N{....namespace Ninner{....}}namespace N{}namespace N.Ninner{} Ñ/Ñ++/C# åäèíèöåé êîìïèëÿöèè ÿâëÿåòñÿ ôàéë,íî åäèíèöåé êîíòåêñòà â C# ÿâëÿåòñÿ èìåííî ïðîñòðàíñòâî èìåí.  Ñ++ âñå îñëîæíÿåòñÿ òåì, ÷òî òðåáóåòñÿ âêëþ÷åíèå çàãîëîâî÷íûõ ôàéëîâ.Ïîñëå âêëþ÷åíèÿ çàãîëîâî÷íîãî ôàéëà ê îáúåêòàì èç ïðîñòðàíñòâàèìåí ìîæíî îáðàùàòüñÿ ÷åðåç êâàëèôèêàòîð (óòî÷íåíèå), òî åñòü std::cout¾ i;  Ñ# íå òðåáóåòñÿ ïîäêëþ÷åíèÿ çàãîëîâî÷íûõ ôàéëîâ, òî åñòü îáðàùåíèå ê îáúåêòàì íåêîòîðîãî ïðîñòðàíñòâà èìåí èäåò ïðîñòî ïî èìåíèïðîñòðàíñòâà èìåí.System.Windows.Forms.Îòñþäà âîçíèêàåò ïîíÿòèå åäèíèöû äèñòðèáóöèè (ñáîðêè). Ïîõîæàÿñèòóàöèÿ â Java (åäèíèöà êîìïèëÿöèè - ôàéë, åäèíèöà äèñòðèáóöèè èêîíòåêñòà - ïàêåò). Áîëåå òîãî, ïðîñòðàíñòâà èìåí ðåàëüíî âëîæåíû äðóãâ äðóãà, òîãäà êàê ïàêåòû íåò.
Òî åñòü èåðàðõè÷åñêèé ïîèñê èìåíè ïðîèçâîäèòñÿ òîëüêî â ñëó÷àå ïðîñòðàíñòâà èìåí.Åñëè ìû èìïîðòèðóåì ïàêåò â Java (import P1.* èëè import P1.x). Âjava ïîÿâèëñÿ ñòàòè÷åñêèé èìïîðò (static import Math.*) ÷òî ïîçâîëÿåòîáðàùàòüñÿ ê ÷ëåíàì äàííîãî ïàêåòà áåç ÿâíîãî óêàçàíèÿ åãî èìåíè. Òîåñòü125x = exp (i);Âñå ïðîñòðàíñòâà èìåí îòêðûòû ñíèçó, òî åñòü ê íèì ìîæíî äîáàâëÿòü êîíòåêñò.
 C# òàê æå ìîæíî ñäåëàòü èìåíà èç ïðîñòðàíñòâà èìåíâèäèìûìè áåç óòî÷íåíèÿ.using Sistem.Windows.FormsÏðè÷åì èìåíà èç òåêóùåãî ïðîñòðàíñòâà èìåí ïåðåêðûâàþò èìåíàèç èìïîðòèðóåìûõ ïðîñòðàíñòâ èìåí. Åñëè æå 2 èìïîðòèðóåìûõ èìåíèêîíôëèêòóþò, òî èìÿ ñòàíîâèòñÿ íåâèäèìûì.Òàêæå ïîÿâëÿåòñÿ êâàëèôèêàòîð äîñòóïà äëÿ êëàññà â ïðîñòðàíñòâåèìåí.namespace N1{class X;};namespace N2{class Y;};N1::X a;N2::Y b;f (a, b);Äàæå åñëè íåò äèðåêòèâû using (îíà íå ðåêîìåíäóåòñÿ), òî âîïðîñ âòîì, ãäå èñêàòü ôóíêöèþ f - N1 èëè N2.Åñëè f íå íàéäåíà â òåêóùåìïðîñòðàíñòâå èìåí, òî ïîèñê áóäåò ïðîäîëæåí è â ïðîñòðàíñòâàõ èìåíàðãóìåíòîâ, åñëè áóäåò íàéäåí íå îäèí âàðèàíò ôóíêöèè f, òî áóäåò âûäàíà îøèáêà.Òàêîå ïðàâèëî äëÿ èìåí ôóíêöèé òðåáóåòñÿ äëÿ òîãî, ÷òîáû ñòàëîâîçìîæíûì ïåðåêðûòèå èìåí èìåí ñòàíäàðòíûõ îïåðàöèé.Îáúåêòíî - îðèåíòèðîâàííûå ÿçûêèïðîãðàììèðîâàíèÿ.Âûäåëÿþò ÎÎßÏ è ïðîñòî îáúåêòíûå.
ÎÎßÏ äîëæíû ïîääåðæèâàòü3 ñâîéñòâà - èíêàïñóëÿöèþ, íàñëåäîâàíèÿ è äèíàìè÷åñêèé ïîëèìîðôèçì.Íàñëåäîâàíèå126Áàçîâûé êëàññ → ïðîèçâîäíûé êëàññ. Ïðîèçâîäíûé êëàññ íàñëåäóåò âñåäàííûå áàçîâîãî êëàññà. C#, Java, DelphiÑ++, Oberon, Aga 95Ñ òî÷êè çðåíèÿ íàñëåäîâàíèÿ, ó ÿçûêîâ ïåðâîé ãðóïïû âñÿ èåðàðõèÿíàñëåäîâàíèÿ íà÷èíàåòñÿ ñ êëàññà Object, òî åñòü âñå îáúåêòû òàê èëèèíà÷å èìåþò êëàññ Object â êà÷åñòâå áàçîâîãî. ÿçûêàõ âòîðîé ãðóïïû ëþáîé êëàññ ìîæåò ñòàòü êîðíåì äåðåâàíàñëåäîâàíèÿ.C++:class Derived: public Base{îáúåêòû íîâûõ ÷ëåíîâ.};Ïðè ýòîì Ñ++ åäèíñòâåííûé ßÏ, êîòîðûé ïîääåðæèâàåò ìîäèôèêàöèþïðàâ äîñòóïà. Ïðèâàòíîå íàñëåäîâàíèå íàèáîëåå ÷àñòî èñïîëüçóåòñÿ ïðèðåàëèçàöèè èíòåðôåéñîâ.C#:class Derived: Base{îáúåêòû íîâûõ ÷ëåíîâ.};Ìîäèôèêàòîð äîñòóïà çàïðåùåí.  C# çàïðåùåíî ìíîæåñòâåííîå íàñëåäîâàíèå, íî ìîæíî íàñëåäîâàòü ìíîæåñòâî èíòåðôåéñîâ.
Íàñòîÿùååìíîæåñòâåííîå íàñëåäîâàíèå ðåàëèçîâàíî òîëüêî â Ñ++ (èç òåõ ßÏ, êîòîðûå ðàññìàòðèâàþòñÿ â êóðñå)Java:class Derived extends Base implements i1, i2{îáúåêòû íîâûõ ÷ëåíîâ.};Ïðè ýòîì, åñëè íå óêàçàí áàçîâûé êëàññ, òî â C# è Java êëàññ ñòàíîâèòñÿ ïîòîìêîì êëàññà Object.Delphi:class Derived class (Base);Oberon:TYPE BASE = RECORD127END;TYPE DERIVED = RECORD (BASE)END;ßçûê Àäà.type base is tagged record....end;type Derived is new Base with record....end;type Derived is new Base with null record;Âòîðàÿ çàïèñü - åñëè íå òðåáóåòñÿ äîáàâëÿòü íîâûå ÷ëåíû äàííûõ.Âñå ÿçûêè ïîçâîëÿþò ëèíåéíî ðàñïðåäåëÿòü ïàìÿòü,èñêëþ÷åíèå - smalltalk.Òàì îáúåêò ïîäêëàññà ìîæåò áûòü îòäåëåí îò ÷àñòè ñóïåðêëàññà.
Òàêèìîáðàçîì, ïîÿâëÿåòñÿ âîçìîæíîñòü âàðüèðîâàòü íàáîð ìåòîäîâ âûïîëíåíèÿ âî âðåìÿ âûïîëíåíèÿ. Ýòî äàåò ÿçûêó îãðîìíóþ ãèáêîñòü, íî ñèëüíîçàìåäëÿåò ðàáîòó ïðîãðàììû, òàê êàê ïðè êàæäîì îáðàùåíèè ê ìåòîäóêëàññà òðåáóåòñÿ ïîèñê ïî âñåé öåïî÷êå íàñëåäîâàíèÿ.Òàêèì îáðàçîì, âñå ÿçûêè ïðîìûøëåííîãî ïðîãðàììèðîâàíèÿ ðåàëèçóþò ëèíåéíîå ðàñïðåäåëåíèå ïàìÿòè.Âñå ôóíêöèè êëàññà ñóùåñòâóþò â åäèíñòâåííîì ýêçåìïëÿðå. Ïðèíàñëåäîâàíèè êàæäûé êëàññ - ñâîÿ îáëàñòü äåéñòâèÿ, òî åñòüclass X{void f();};class Y:public X{int f;};Òî åñòü â êëàññàõ X è Y èìåíà ìîãóò ñîâïàäàòü. Ñ òî÷êè çðåíèÿ ÿîáëàñòè äåéñòâèÿ èìååò ìåñòî 2 ïðèíöèïà- ïåðåãðóçêà- ñêðûòèåÏî÷òè âî âñåõ ñëó÷àÿõ ðå÷ü èäåò èìåííî è ñêðûòèè. Òî åñòü ìû äîëæíû ðàçëè÷àòü èìåíà ôóíêöèé (äîïóñêàþò ïåðåãðóçêó) è èìåíà îñòàëüíûõ îáúåêòîâ.128Y y;y.f();Òàêîå îáðàùåíèå - îáðàùåíèå ê int f.
Òàê êàê void f() ñêðûòî. Òî åñòüòàêîå îáðàùåíèå ïðèâåäåò ê îøèáêå. Ðàññìîòðèì äðóãîé âàðèàíòclass X{void f();};class Y:public X{void f(int);}; äàííîì ñëó÷àå ðå÷ü èäåò òàê æå î ñêðûòèè, òî åñòü f() áóäåò ïåðåêðûòà f(int). Òî åñòü êëàññ y îáëàäàåò òîëüêî ôóíêöèåé y.f(int).Ïåðåãðóçêà âîçìîæíà òîëüêî â îäíîé îáëàñòè äåéñòâèÿ. Äëÿ èìåíôóíêöèé ïîÿâëÿåòñÿ è òðåòèé âàðèàíò - ïåðåîïðåäåëåíèå. Ýòî òîëüêîäëÿ ôóíêöèé, êîòîðûå îáëàäàþò äèíàìè÷åñêèì ñâÿçûâàíèåì.class X{virtual void f();};class Y:public X{void f();};Ôóíêöèþ èç êëàññà - ïðåäêà ìîæíî âûçâàòü ïóòåì ÿâíîãî óêàçàíèÿèìåíè êëàññà.
y.X::f().Áîëåå õèòðàÿ ñèòóàöèÿ â ÿçûêå Java.Ðàññìîòðèì òåïåðü ìîäóëüíûå ßÏ - Àäà - 95 è Îáåðîí.<= Oberon =>MODULE M;TYPE BASE* =RECORDI:INTEGER;J*:REAL;END;END M;129MODULE M1;IMPORT M;TYPE DERIVED *= RECORD (M.BASE)K: INTEGER;END;PROCUDURE P(VAR X:DERIVED);BEGINX.K := 0;X.J := 1;X.I := 1; Îøèáêà;END:Òî åñòü, åñòü ëèáî ïóáëè÷íûå ÷ëåíû äàííûõ (*), ëèáî ïàêåòíûå ÷ëåíûäàííûõ, êîòîðûå âèäíû òîëüêî â ïðåäåëàõ ïàêåòà.Ðàññìîòðèì ÿçûê Àäà.package M isType Base is tagged private;...priatetype Base is tagged record...end record;end M;package M1 isuse M;type Derived is new Basewith recordK:integer;end record;procudere B(VAR X:inout Derived) is ...Äàëåå,â Àäà ïîÿâëÿåòñÿ ïîíÿòèå äî÷åðíèõ ïàêåòîâ.package M.M1 istype Derived is new Base withrecordK:Integer;end record;procedure P(X: inout Derived);130Âñå èìåíà, êîòîðûå îïèñàíû â M äîñòóïíû â M1(äàæå ïðèâàòíûå).Ìíîæåñòâåííîå íàñëåäîâàíèåÏðîáëåìû1.
Êîíôëèêò èìåí2. Ðåàëèçàöèÿ3. Ïðèñâàèâàíèå îáúåêòîâ ðàçíûõ êëàññîâ.4.Base * pb = new Base;Derived * pd = new Derived;pb = pd;pb -> f();Çäåñü âñå íîðìàëüíî.class X:public Y, public Z{};X * px = new X;Y * py = new Y;Z * pz = new Z;px = pz; Errorpy = px;pz = px;pz -> f (); ñëó÷àå âèðòóàëüíûõ ìåòîäîâ âîïðîñ åùå ñèëüíåå óñëîæíÿåòñÿ, òàê êàêêîìïèëÿòîð íà ýòàïå êîìïèëÿöèè íå çíàåò êàêîé èìåííî ìåòîä âûçûâàòü.131Ëåêöèÿ 2911.12.2008Èòàê áûëî îòìå÷åíî òðè ïðîáëåìû ñâÿçàííûå ñ ìíîæåñòâåííûì íàñëåäîâàíèåì1. Êîíôëèêò èìåí.Ñ++ äîïóñêàåò ïîëíîå ìíîæåñòâåííîå íàñëåäîâàíèå.Ñ++ Îäèí èçíåìíîãèõ ÿçûêîâ, äîïóñêàþùèõ ïîëíîå ìíîæåñòâåííîå íàñëåäîâàíèå.
Ïðèýòîì îãðàíè÷åííîå ìíîæåñòâåííîå íàñëåäîâàíèå (èíòåðôåéñû) åñòü ïî÷òè âî âñåõ ñîâðåìåííûõ ßÏ. Ïðè íàñëåäîâàíèè èíòåðôåéñîâ êîíôëèêòîâàòü ìîãóò òîëüêî èìåíà ìåòîäîâ.2. Ñëîæíîñòè ðåàëèçàöèè.Òðåáîâàíèå êîððåêöèè óêàçàòåëåé â ñëó÷àå ëèíåéíîãî ðàçìåùåíèÿïàìÿòè (ïðèñóòñòâóåò ïî÷òè âî âñåõ ÿçûêàõ ïðîìûøëåííîãî ïðîãðàììèðîâàíèÿ).3.Èäåîëîãè÷åñêèå ñîîáðàæåíèÿ (íå ðàññìàòðèâàåì)Ïðèìåð èåðàðõèèX− > W < −YL− > X− > W < −Y < −LL− > W < −L Òàêîå íåäîïóñòèìîÏîèñê èìåí ïðîèñõîäèò ñíà÷àëà â ñâîåì ïðîñòðàíñòâå èìåí, à ïîòîìïàðàëëåëüíî â âûñøèõ ïîðÿäêàõ (ìåõàíèçì, ñõîæèé ñ ìåõàíèçìîì ïîèñêà â ïðîñòðàíñòâàõ èìåí).Äëÿ ïîëó÷åíèÿ äîñòóïà ê ÷ëåíàì äàííûõ êëàññîâ - ïðåäêîâ ìîæåòïîòðåáîâàòüñÿ ÿâíàÿ ñïåöèôèêàöèÿ. òàêèõ ÿçûêàõ, êàê C#, Java, Delphi, â êîòîðûõ âñå îáúåêòû íàñëåäóþò êëàññ Object, èìåþòñÿ îáîáùåííûå (àáñòðàêòíûå) êîíòåéíåðû, âêîòîðûõ ìîãóò õðàíèòüñÿ îáúåêòû ëþáîãî òèïà.Åñëè òðåáóåòñÿ õðàíèòü îäèí è òîò æå îáúåêò â êà÷åñòâå äâóõ ñóùíîñòíîé, òî ýòî ìîæíî ðåàëèçîâàòü ñ ïîìîùüþ ìíîæåñòâåííîãî íàñëåäîâàíèÿ.
Òàêèå èåðàðõè÷åñêèå ñòðóêòóðû èçó÷àåòñÿ â îñîáîì ðàçäåëåìàòåìàòèêè - òåîðèè ðåøåòîê èëè òåîðèè êàòåãîðèé.Áðèëëèàíòîâîå (ðîìáîâèäíîå) íàñëåäîâàíèåX/\AW\/Y132Ïðèìåðîì òàêîãî íàñëåäîâàíèÿ ìîæåò ñëóæèòü ïðîåêòèðîâàíèå ìîäóëÿ <iostream>. Óïðîùåííàÿ èåðàðõèÿ âûãëÿäèò òàê.ios(int fd)/\/\istreamostream\/\/iostreamclass A{};class X:public virtual A{};class Y:public virtual B{};class W:public X, public Y{};Åñëè îïóñòèòü õîòÿ áû îäíî ñëîâî virtual, òî "ðîìáîâèäíîãî"íàñëåäîâàíèÿíå áóäåò. Íåäîñòàòêîì òàêîé ñõåìû ñëóæèò òî, ÷òî ðåøåíèå î òèïå íàñëåäîâàíèÿ äîëæíî ïðèíèìàòüñÿ íà ýòàïå åäèíè÷íîãî íàñëåäîâàíèÿ.Ýòî íå ÿâëÿåòñÿ íåäîñòàòêîì Ñ++, íî ñâîéñòâîì íàñëåäîâàíèÿ, òàêêàê âñÿ èåðàðõèè äîëæíà ðàçðàáàòûâàòüñÿ íà ýòàïå ïðîåêòèðîâàíèÿ. Ñ++ íåò íèêàêèõ îãðàíè÷åíèé ñ òî÷êè çðåíèÿ íàñëåäîâàíèÿ, òîåñòü íåò íèêàêèõ ÿçûêîâûõ ìåòîäîâ çàïðåòèòü íàñëåäîâàíèÿ äàííîãîêëàññà. Êîíå÷íî, ìîæíî ñäåëàòü êîíñòðóêòîð èëè äåñòðóêòîð çàêðûòûìè, íî ýòî óæå íå èçâîðîòû. Java ìîæíî çàïðåòèòü íàñëåäîâàíèå, ñ ïîìîùüþ êëþ÷åâîãî ñëîâànal.
Åñëè ýòî ñëîâî ñòîèò ïåðåä èìåíåì ìåòîäà, òî ýòîò ìåòîä íå ìîæåò ïåðåîïðåäåëÿòüñÿ â ïðîèçâîäíûõ êëàññîâ. Åñëè æå îíî ñòîèò ïåðåäîïðåäåëåíèåì êëàññà, òî êëàññ íåëüçÿ íàñëåäîâàòü.  Ñ# òàêóþ æå ðîëüèãðàåò ñëîâî sealed.Ïî÷òè âñå áèáëèîòåêà .NET ÿâëÿåòñÿ çàïå÷àòàííîé, òî åñòü èç íåëüçÿíàñëåäîâàòü, à òå êëàññû, èç êîòîðûõ ìîæíî íàñëåäîâàòü îáû÷íî ÿâëÿþòñÿ àáñòðàêòíûìè.Çàïå÷àòûâàíèå ìîæåò ïîâûñèòü ýôôåêòèâíîñòü ïðîãðàììû.133Äèíàìè÷åñêîå ñâÿçûâàíèå ìåòîäîâ.Áåç äèíàìè÷åñêîãî ñâÿçûâàíèÿ ìåòîäîâ ïîíÿòèå íàñëåäîâàíèÿ ïðàêòè÷åñêè òåðÿåò ñâîé ñìûñë. Íàñòîÿùåå íàñëåäîâàíèå ïðîÿâëÿåòñÿ òîëüêîïðè èñïîëüçîâàíèè äèíàìè÷åñêîé òèïèçàöèè.
 ÿçûêàõ èíäóñòðèàëüíîãîïðîãðàììèðîâàíèÿ (ñî ñòðîãîé òèïèçàöèåé) çàìåíà îáúåêòà ñóïåð-êëàññàíà îáúåêò ïðîèçâîäíîãî êëàññà íè÷åãî íå ìåíÿåò ñ òî÷êè çðåíèÿ íàäåæíîñòè.base=derivedvoid foo (base b);f(base)f(derived)Äðóãîå äåëî, êîãäà âìåñòî îáúåêòà ïåðåäàåòñÿ ññûëêà íà îáúåêò. Âÿçûêàõ ãäå åñòü íàñëåäîâàíèå, åñòü ïîíÿòèå ñòàòè÷åñêîãî òèïà, òî åñòüòèïà, ïðèñâîåííîãî îáúåêòó ïðè ñîçäàíèè.var X = new System.Window.Forms.FormÏðè ýòîì òèï îáúåêòà X ñòàòè÷åñêè îïðåäåëèì. Îáúåêòíûõ ßÏ äëÿ íåêîòîðûõ îáúåêòîâ ÒÏ ïîÿâëÿåòñÿ äèíàìè÷åñêèé òèï - òèï îáúåêòà äàííûõ, íà êîòîðûé ññûëàåòñÿ óêàçàòåëü èëèññûëêà.Base * pd;Ñòàòè÷åñêîé òèï - Base, à äèíàìè÷åñêèì òèïîì ìîæåò áûòü ëþáîé èçïîòîìêîâ Base, òàê êàê pb ìîæåò óêàçûâàòü íà ëþáîãî îáúåêòà-ïîòîìêàBase.Ñòàòè÷åñêèé òèï îáúåêòà äàííûõ èçìåíèòü íåëüçÿ.
Êàæäûé îáúåêòîáëàäàåò êóñêîì ïàìÿòè, äëÿ êîòîðîãî áûë âûçâàí êîíñòðóêòîð. C#, Java è Delphi, îáúåêò ðàçìåùàåòñÿ â äèíàìè÷åñêîé ïàìÿòè, èêàê òîëüêî îí áûë òàì ðàçìåùåí åãî òèï çàôèêñèðîâàí.Íå-ñòàòè÷åñêèé ìåòîä êëàññà - ìåòîä, âûçûâàåìûé ÷åðåç ññûëêó íàîáúåêò. Ìåòîä íàçûâàåòñÿ ñòàòè÷åñêè ïðèâÿçàííûì, åñëè åãî âûçîâ îïðåäåëÿåòñÿ èç ñòàòè÷åñêîãî òèïà ññûëêè, è äèíàìè÷åñêè åñëè åãî âûçîâîïðåäåëÿåòñÿ äèíàìè÷åñêèì òèïîì ññûëêè.Òî åñòü îïðåäåëÿåòñÿ äèíàìè÷åñêèé òèï ññûëêè, è äëÿ ýòîãî òèïàâûçûâàåòñÿ ìåòîä.134 Ñ++ ýòî ðåàëèçóåòñÿ íà îñíîâå âèðòóàëüíûõ ôóíêöèé.