Главная » Просмотр файлов » лекции (2008) (by Kravets) (укороченное)

лекции (2008) (by Kravets) (укороченное) (1160827), страница 21

Файл №1160827 лекции (2008) (by Kravets) (укороченное) (лекции (2008) (by Kravets) (укороченное)) 21 страницалекции (2008) (by Kravets) (укороченное) (1160827) страница 212019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 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 (){}}; Èíòåðôåéñå íå äîëæíî áûòü íå âèðòóàëüíûõ ìåòîäîâ, ÷ëåíîâ äàííûõ èëè ïðèâàòíûõ ÷ëåíîâ. Òàêèìîáðàçîì èíòåðôåéñ ñîñòîèò òîëüêî èç óêàçàòåëåé íà òàáëèöó âèðòóàëüíûõ ìåòîäîâ.Åäèíñòâåííûé ìåòîä, êîòîðûé ìîæåò èìåòü ðåàëèçàöèþ â èíòåðôåéñå - äåñòðóêòîð.Âîçìîæíà ñèòóàöèÿ, êîãäà â êëàññå èíòåðôåéñà îòñóòñòâóåò äåñòðóêòîð (äåñòðóêòîð ïî óìîë÷àíèå). Åñëèäåñòðóêòîð íå âèðòóàëüíûé, òî ìû íå ìîæåì ïîëüçîâàòüñÿ èì êàê èíòåðôåéñîì.

Характеристики

Тип файла
PDF-файл
Размер
364,52 Kb
Тип материала
Высшее учебное заведение

Список файлов лекций

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6616
Авторов
на СтудИзбе
295
Средний доход
с одного платного файла
Обучение Подробнее