лекции (2008) (by Kravets) (укороченное) (1160827), страница 21
Текст из файла (страница 21)
Ïåðåîïðåäåëÿÿ ïðèâàòíóþ ôóíêöèþ,ìû äàåì áàçîâîìó êëàññó âûçûâàòü ïðèâàòíóþ ôóíêöèþ íàøåãî êëàññà.Ïåðåîïðåäåëÿÿ ôóíêöèþ, ìû îòêàçûâàåìñÿ îò íàñëåäîâàíèÿ ðåàëèçàöèè. ÏðèìåðFigure| \/|\Point Circle Rect/virtual void Draw ();Íàñëåäîâàòü íå îáÿçàòåëüíî,íî äîïóñòèì, ÷òî Circle → Ellipse è åñòü ñïèñîê èç ôèãóð. Òîãäà íàðèñîâàòü âñåôèãóðû ìîæíî òàê83while (L != NULL){L-> f ->Draw ();L = L -> next;}×òîá ñîçäàòü íîâûé òèï äàííûõ, íóæíî ïðîñòî îïðåäåëèòü íîâûé êëàññ, è òàì ïåðåîïðåäåëèòü ñîîòâåòñòâóþùèå ìåòîäû. Íàïðèìåðvoid PatternRect::Draw(){Full (pattern);Rect::Draw ();}Òî åñòü âûçûâàåòñÿ óíàñëåäîâàííûé, à íå ïåðåîïðåäåëåííûé ìåòîä.
Òàêàÿ êîíñòðóêöèÿ - ñíÿòèå ñâîéñòâàâèðòóàëüíîñòè ìåòîäà.Rect *f = new PatternRect;f -> Rect::Draw (); âûçîâ ìåòîäà Draw äëÿ Rect;Äëÿ ïðèâàòíûõ âèðòóàëüíûõ ôóíêöèé âîçìîæíî ëèáî ïîëíîå çàìåùåíèå ëèáî ïîëíîå íàñëåäîâàíèå, íîíå èñïîëüçîâàíèå â çàìåùåíèè.84Ëåêöèÿ 3016.12.2008 Ñ++ ìåòîä ÿâëÿåòñÿ âèðòóàëüíûì, åñëè îí ïîìå÷åí êëþ÷åâûì ñëîâîì virtual.
Ïðè ýòîì çàìåùåíèåìåòîäà ìîæåò èäòè òîëüêî ïðè íàñëåäîâàíèè. Äëÿ çàìåùåíèÿ íåîáõîäèìî, ÷òîá ñîâïàäàëè èìÿ è ñèãíàòóðàïàðàìåòðîâ (ïðîôèëü ïàðàìåòðîâ äîëæåí ñîâïàäàòü), òèï âîçâðàùàåìîãî çíà÷åíèÿ äîëæåí áûòü êîâàðèàíòåí.Òàêèì îáðàçîì, åñëè ôóíêöèÿ âîçâðàùàåò îäèí èç áàçîâûõ òèïîâ ÿçûêà (int, double) òî òèï âîçâðàùàåìîãîçíà÷åíèÿ äîëæåí ñîâïàäàòü.  ñëó÷àå, åñëè îíà âîçâðàùàåò îáúåêò êëàññà, òî ïðè ïåðåîïðåäåëåíèè ôóíêöèÿìîæåò âîçâðàùàòü ïðîèçâîäíûé îò íåãî òèï.class Base{public:virtual base * clone ();};class Derived: public Base{public:Derived * clone ();};Âñå çàìåñòèòåëè âèðòóàëüíîé ôóíêöèè ïî îïðåäåëåíèþ áóäóò âèðòóàëüíûìè.Ïðè ýòîì îñòàåòñÿ âîïðîñ ñ ïðàâàìè äîñòóïà. Òî åñòü åñëè îòêðûòàÿ ôóíêöèÿ ïåðåîïðåäåëåíà êàê ïðèâàòíàÿ, òî îíà ìîæåò áûòü âûçâàíà èç èíòåðôåéñà áàçîâîãî êëàññà.class Base{public:virtual base * clone ();};class Derived: public Base{private:Derived * clone ();};Base * pb = new Base;pb -> clone ();Derived * pd = new Derived;pd -> clone ();//íåëüçÿpb = pd;pb -> clone ();//OkÒåïåðü ðàññìîòðèì Java, òàì èäåò óïðàâëåíèå âèäèìîñòüþ, à íå äîñòóïîì.X:public void f() {}class Y extends X{private void f(){}} äàííîì ñëó÷àå ïðèâàòíàÿ ôóíêöèÿ âîîáùå íå âèäíà, òî åñòü åå âûçâàòü ìîæíî òîëüêî âíóòðè êëàññàY.
Èçâíå áóäåò âûçûâàòüñÿ ôóíêöèÿ êëàññà X. Java âñå ôóíêöèè ïî óìîë÷àíèþ äèíàìè÷åñêèå, åäèíñòâåííûé ñïîñîá çàïðåòèòü äèíàìè÷åñêîå çàìåùåíèå - êëþ÷åâîå ñëîâî nal. Åñëè â java íå ñîâïàäàåò èìÿ - òî ýòî ïðîñòî íîâàÿ ôóíêöèÿ, åñëè ñîâïàäàåò èìÿ,íî íå ñîâïàäàåò ïðîôèëü, òî ýòî ñêðûòèå. Åñëè æå ñîâïàäàåò èìÿ è ïðîôèëü, íî òèï âîçâðàùàåìûõ çíà÷åíèéíå êîâàðèàíòåí, òî ýòî îøèáêà.class Y extends X{public final void f(){}};85Y y = new Y_Derived;y -> f();Ïðè ýòîì áóäåò âñåãäà âûçâàí èìåííî ìåòîä èç êëàññà Y, òàê êàê îíà îáúÿâëåíà êàê nal.Ðàññìîòðèì òåïåðü C# è Delphi.
Êàê è â Ñ++ òàì åñòü êàê âèðòóàëüíûå, òàê è íå âèðòóàëüíûå ìåòîäû.Åñëè â C# ìåòîä îáúÿâëåí êàê âèðòóàëüíûé, òî â êëàññå íàñëåäíèêå âîçìîæíà ñëåäóþùàÿ ñèòóàöèÿ - ôóíêöèÿ, ó êîòîðîé ñîâïàäàåò ïðîôèëü, èìÿ, è êîâàðèàíòåí òèï âîçâðàùàåìîãî çíà÷åíèÿ íå îáÿçàíà çàìåùàòü.Òàêèì îáðàçîì òðåáóåòñÿ åùå ìîäèôèêàòîð override.class Y::X{};public override void f(){..}Åñëè ñëîâà override íåò, òî ñâîéñòâî äèíàìè÷åñêîãî ñâÿçûâàíèÿ òåðÿåòñÿ.
Òî åñòü.class Y:X{};publicvoid f(){..} äàííîì ïðèìåðå äëÿ ôóíêöèè f íåò äèíàìè÷åñêîãî ñâÿçûâàíèÿ. Delphitype X = classprocedure P; virtual;end;type Y = class (X)procedure P;override;end;Òî åñòü ñèòóàöèÿ àíàëîãè÷íàÿ C#. C# â ñëó÷àå îòñóòñòâèå override èëè new â îïðåäåëåíèè ôóíêöèè âûäàåòñÿ ïðåäóïðåæäåíèå.class Z: Y{public virtual void f();};Y y = new Z();y.f ();Òåïåðü áóäåò âûçâàíà ôóíêöèÿ èç Z, òàê êàê â êëàññå Z îïÿòü óêàçàííî ñëîâî virtual.Òàê æå âîçìîæíà ñèòóàöèÿ, êîãäà ôóíêöèÿ íå áûëà âèðòóàëüíîé â áàçîâûõ êëàññàõ, íî ñòàëà âèðòóàëüíîéâ êëàññå ïîòîìêå.Ðàññìîòðèì ÿçûê Îáåðîí - 2.  îäíîé èç âåðñèÿ ïîÿâèëèñü ïðîöåäóðû, äèíàìè÷åñêè ïðèâÿçàííûå ê òèïó.Ðàññìîòðèì ñíà÷àëà âàðèàíò ñ ïîëåì òèïà.TYPE FIGURE* = RECORD....END;TYPE LINE* = RECORD (FIGURE)...END;TYPE CIRCLE* = RECORD (FIGURE)....END;PROCEDURE DRAW (VAR F: FIGURE); (VAR X: LINE);IF F IS LINE THEN86DRAWLINE (LINE.F);ELSEIF F IS CIRCLE THENDRAWCIRCLE (CURCLE.F);Òåïåðü ðàññìîòðèì âàðèàíò ñ äèíàìè÷åñêîé ïðèâÿçêîé òèïà.PROCEDURE (VAR F: FIGURE) DRAW();PROCEDURE (VAR C: CIRCLE) DRAW();Ýòî åäèíñòâåííûé ñëó÷àé, êîãäà â Îáåðîí - 2 ðàçðåøåíà ïåðåãðóçêà èìåí.
Âîïðîñ - êàê ýòî âûçûâàòü?PROCEDURE DRAWALL (VAR F.FUGURE);...F.DRAW (); ïñåâäî ìîäóëå îïðåäåëåíèÿ áóäåò ñãåíåðèðîâàí ñëåäóþùèé êîä.TYPE FIGURE =RECORDÎáúÿâëåíèå âèäèìûõ ÷ëåíîâ.PROCEDURE DRAW();END;DRAW () - âûçîâ óíàñëåäîâàííîé ðåàëèçàöèè (ñíÿòèå âèðòóàëüíîñòè).FIGURE INTERSECT (F1, F2: figure);Äëÿ êàæäîé ïàðû òèïîâ Òðåáóåòñÿ íàïèñàòü ñâîþ ïðîöåäóðó INTERSECT. Âîïðîñ îïÿòü æå êàê åå âûçâàòü?Îäèí èç âàðèàíòîâ - f1@f2.intersect. Íî òå ÿçûêè, êîòîðûå ìû ñåé÷àñ ðàññìàòðèâàåì íå èìåþò ìóëüòèìåòîäîâ.Òåïåðü ðàññìîòðèì Àäà - 95. Òàì íåòó âèðòóàëüíûõ ìåòîäîâ â ÿâíîì âèäå.type Base is tagged record ... end record;type Derived is new Base with record <íîâûå ÷ëåíû è îáúÿâëåíèÿ> end record;procedure P( x: Base);procedure P( y: Derived);Ïîêà ðå÷ü î çàìåùåíèè èëè äèíàìè÷åñêîé ïðèâÿçêè ê òèïó íåòó.
Òî åñòüb: Base;d: Derived;P(b);{P(Base)}P(d);{P(Derived)}P(Y'Base);{P(Base)} Àäà - 95 áûëè ââåäåíû CW - ïåðåìåííûå (class wide) è CW - Òèïû. CW - Òèïû (êëàññîâûå òèïû).T'class - îáúåäèíåíèå T è âñåõ îáúåêòîâ, ïðîèçâîäíûõ îò íåãî.X: Base'class - ïîëíûé àíàëîã íåîãðàíè÷åííûõ ïåðåìåííûõ. Òàêîé ïåðåìåííîé ìîæíî ïðèñâàèâàòü ëþáîéîáúåêò êëàññà Base èëè ïðîèçâîäíûõ îò íåãî.P(X) - äèíàìè÷åñêèé âûçîâ.P(b);P(d);P(X);staticstaticdynamicFIGURE → LINEFIGUGE → CIRCLEprocedure DrawAll (p: Figure'class)Ëþáàÿ ïðîöåäóðà, êîòîðàÿ èìååò õîòÿ áû îäíèì ïàðàìåòðîì îáúåêò òåãèðîâàííîãî òèïà ìîæåò áûòüâûçâàíà äèíàìè÷åñêèì îáðàçîì, ïðè÷åì òåãèðîâàííûé îáúåêò äîëæåí áûòü çàìåíåí íà îáúåêò êîíêðåòíîãîòèïà.87function Intersect (X, Y: Figure) return Figure;function Intersect (A, B: Figure'class) return Figure;{Bad}Íî ìû íå ìîæåì âûçâàòü ïðîöåäóðó, ó êîòîðîé áîëåå îäíîãî ïàðàìåòðà ÿâëÿåòñÿ êëàññîâûìè òèïàìè.
Òîåñòü òîëüêî îäèí ïàðàìåòð ìîæåò áûòü êëàññîâîãî òèïà. Íî âîçìîæíî íàïèñàòü Intersect (X, L) èëè Intersect(C, X), òî åñòü óêàçûâàÿ îäèí êëàññîâûé ïàðàìåòð.class Figure {public:virtual void Draw ();};class circle: public Figure {public:void Draw ();};Òàêàÿ ðåàëèçàöèÿ âûçîâåò îøèáêó (íå îïèñàòü Figure::Draw()), ÷òî íå ïîçâîëÿåò èíèöèàëèçèðîâàòü òàáëèöó âèðòóàëüíûõ ìåòîäîâ. Êëàññ Figure - àáñòðàêòíûé êëàññ.Âî âñåõ ÎÎßÏ åñòü ïîíÿòèå àáñòðàêòíîãî êëàññà.  Ñ++ åñòü ïîíÿòèå ÷èñëî âèðòóàëüíîé ôóíêöèè.Êëàññ, êîòîðûé èìååò õîòÿ áû îäíó ÷èñòî âèðòóàëüíóþ ôóíêöèþ íàçûâàåòñÿ àáñòðàêòíûì. Íåëüçÿ ñîçäàòüîáúåêòû òàêîãî êëàññà.
Ñèíòàêñè÷åñêè ýòî ðåàëèçóåòñÿ êàê virtual void Draw() = 0;Ýòî îçíà÷àåò ÷òî ñîîòâåòñòâóþùàÿ ôóíêöèÿ ìîæåò èìåòü ðåàëèçàöèþ, à ìîæåò è íå èìåòü.Figure f;//ErrFigure * p;//Okp = new Figure;//Errp = 0; //Okp = new Line;//Ok Ñ# è Java åñòü êëþ÷åâîå ñëîâî abstract, ÷òî îçíà÷àåò ÷òî ìåòîä ÿâëÿåòñÿ âèðòóàëüíûì è ïðèòîì ÷èñòîâèðòóàëüíûì. Åñëè ó êëàññà åñòü õîòü îäèí àáñòðàêòíûé ìåòîä, òî êëàññ ÿâëÿåòñÿ àáñòðàêòíûì, òî ïåðåäåãî îïðåäåëåíèåì äîëæíî ñòîÿòü êëþ÷åâîå ñëîâî abstract.88Ëåêöèÿ 3118.12;2008Ãëàâà 3. ÈíòåðôåéñûÈíòåðôåéñ - îñîáàÿ ÿçûêîâàÿ êîíñòðóêöèÿ, êîòîðàÿ ñîäåðæèò îáúÿâëåíèå íàáîðà ïóáëè÷íûõ ìåòîäîâ.Èíòåðåñ íå ñîäåðæèò ÷ëåíîâ äàííûõ, îí ìîæåò ñîäåðæàòü òîëüêî ñòàòè÷åñêèå ÷ëåíû.Èíòåðôåéñ ìîæåò íàñëåäîâàòüñÿ (ïðè íàñëåäîâàíèè ðàññìàòðèâàþòñÿ êàê àáñòðàêòíûå êëàññû). Ñ++ èíòåðôåéñû ìîäåëèðóþòñÿ ñ ïîìîùüþ àáñòðàêòíûõ êëàññîâ. C# è Java ïðèñóòñòâóþò ÿâíî (interface).Ðàññìîòðèì 2 âîïðîñà1.
Ðåàëèçàöèþ ìåòîäîâ èíòåðôåéñà (ÿâíàÿ èëè íåÿâíàÿ)2. Èíòåðôåéñû è âèðòóàëüíûå ìåòîäû.Èíòåðôåéñû â Ñ++class Interface{public:virtual void f() = 0;virtual int g() = 0;virtual void ~Interface (){}}; Èíòåðôåéñå íå äîëæíî áûòü íå âèðòóàëüíûõ ìåòîäîâ, ÷ëåíîâ äàííûõ èëè ïðèâàòíûõ ÷ëåíîâ. Òàêèìîáðàçîì èíòåðôåéñ ñîñòîèò òîëüêî èç óêàçàòåëåé íà òàáëèöó âèðòóàëüíûõ ìåòîäîâ.Åäèíñòâåííûé ìåòîä, êîòîðûé ìîæåò èìåòü ðåàëèçàöèþ â èíòåðôåéñå - äåñòðóêòîð.Âîçìîæíà ñèòóàöèÿ, êîãäà â êëàññå èíòåðôåéñà îòñóòñòâóåò äåñòðóêòîð (äåñòðóêòîð ïî óìîë÷àíèå). Åñëèäåñòðóêòîð íå âèðòóàëüíûé, òî ìû íå ìîæåì ïîëüçîâàòüñÿ èì êàê èíòåðôåéñîì.