Главная » Просмотр файлов » Основы программирования

Основы программирования (947332), страница 56

Файл №947332 Основы программирования (Иванова Г.С. Основы программирования) 56 страницаОсновы программирования (947332) страница 562013-09-15СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 56)

Тип объекта известен уже на этапе компиляции про­граммы: он совпадает с типом переменной-объекта, следовательно, и метод,вызываемый в программе, можно определить на этапе компиляции (раннеесвязывание). Данный вариант переопределения методов получил названиепростого полиморфизма, а сами методы были названы статическими поли­морфными.Списки параметров статических полиморфных методов могут разли­чаться. Так, в рассмотренном выше примере метод Init класса TRoom имеетдва параметра, а метод Init класса TVRoom2 - три параметра.Обращение объекта производного класса к переопределенному ме­тоду базового класса из программы.

Объект производного класса можетобратиться к переопределенному методу базового класса из программы, нодля этого необходимо явно переопределить тип объекта, используя имя базо­вого класса как функцию:<имя базового класса>(<имя объекта производного класса>).<имя метода>.335Часть 2. Объектно-ориентированноепрограммированиеНапример:VarA: TVRoom2;,.,TRoom(A),Square;..{вызываем метод базового класса}Такое переопределение типа в ООП нгзы^^гют восходящим приведениемтипа в отличие от нисходящего^ которое используется, если требуемые мето­ды или поля производного класса при обращении к объекту того же классачерез указатель базового класса не видны (рис. 11.4). Восходящее приведе­ние типа возможно всегда, в то время как при выполнении нисходящего при­ведения необходимо быть уверенным, что в данный момент времени указа­тель действительно содержит адрес объекта производного класса или его по­томков.11.5.

Сложный полиморфизм. КонструкторыСуществуют три случая, в которых определение типа объекта на этапекомпиляции программы невозможно, и, следовательно, невозможно правиль­ное подключение переопределенного метода. Рассмотрим один из такихслучаев.Пример 11.5, Разработать классы для реализации объекта Комната П,который должен отвечать на запрос о площади пола, выводя результат сразуна экран, и объекта Трехмерная комната П, который должен отвечать на за­прос о площади стен и потолка, также выводя результат на экран (рис. 11.11).Класс TRoom2 строим аналогично классу TRoom, добавив метод выво­да результата на экран Print. Класс TVRoomP наследуем от TRoomP, пере­определив метод определения площади и метод инициализации полей объек­та (рис.

11.11).В результате классы будут описаны следующим образом.Площадь?ГКомната ПTRoomPlength, widthSquare(), Init(), Print()Трехмернаякомната ПTVRoomPheightSquare(), Init()Lс7Площадь?L_ .^Рис. 11.11. Объекты:Комната П {а) иТрехмерная комната П (б)336Рис. 11.12. Иерархияклассов дляTVRoomP//. Иерархии классовВ а р и а н т 1 - е ошибкой!Program ex;Type TRoomP=objectlength, width:real;{поля: длина и ширина комнаты}/unction Square:real; {метод определения площади}procedure Print;{мотод вывода результата на экран}procedure /лОДн'.т^яО;{инициализирующий метод}end;Function TRoomPSquare; {метод определения площади}BeginSquare: = length * width;End;Procedure TRoomPPrint; {метод вывода результатов}BeginWriteLnCIInouiadb =', Square:6:2); {внутренний вызов метода}End;Procedure TRoomPJnit; {тело инициализирующего метода}Beginlength: ="1;width: ^^w;End;Type TVRoomP = object(TRoomP)height:real;{дополнительное поле класса}function Square:real; {переопределенный метод класса}procedure Init(l,w,h:real); {переопределенныйинициализирующий метод}end;Procedure TVRoomPInit;BeginшЛт/еб//«/7(7,wj;{инициализирует поля базового класса}height: =h;{инициализируем собственное поле класса}End;Function TVRoomPSquare;Begin {обращаемся к методу базового класса}Square :=inherited Square + 2*height*(length + width);End;Var A:TRoomP; B:TVRoomP; {объявляем объекты-переменные}BeginA.Init(3.5,5,1);{инициализируем поля объекта A}A.Print;{выведет «Площадь = 17.85»}B.Init(3,5,5,1,2.7); {инициализируем поля объекта В}B.Print;{выведет «Площадь = 17.85» - ошибка!!!}End337Часть 2.

Объектно-ориентированноепрограммированиеКласс TRoomPКласс TVRoomPМетод PrintМетод PrintНаследуетсяIПереопределяется^1Метод Square-*мМетод Square1 1- Раннее связываниеПозднее связываниеРис, 11.13. Необходимость позднего связыванияОшибка возникла из-за того, что метод Print, который наследуется клас­сом TVRoomP, вызывает метод Square.

Метод Square в производном классепереопределяется, но метод Print ничего об этом не «знает» и по-прежнемувызывает метод Square класса TRoomP (см. пунктирные стрелки на рис.11.13).Для того чтобы метод базового класса мог в зависимости от типа объек­та, для которого он вызван, обращаться либо к методу базового класса, либок переопределенному методу производного класса, необходимо тип объектаопределять на этапе выполнения программы (позднее связывание). Пере­определение методов в этом случае называют слоэюным полиморфизмом, асоответствующие методы ~ виртуальными полиморфными.Для организации сложного полиморфизма необходимо:1) переопределяемые методы описать служебным словом virtual;2) к методам класса с виртуальными полиморфными методами добавитьспециальный метод-процедуру - конструктор, в котором служебное словоprocedure заменено служебным словом constructor;3) вызвать конструктор прежде, чем произойдет первое обращение квиртуальным полиморфным методам.Методы, объявленные виртуальными полиморфными, на этапе компиля­ции подключаться не будут.

Для каждого класса, содержащего виртуальныеполиморфные методы, будет построена специальная внутренняя таблицавиртуальных методов (ТВМ), в которой будут записаны адреса виртуальныхполиморфных методов. Этой таблицей пользуются все объекты данногокласса для определения адресов виртуальных полиморфных методов на эта­пе выполнения программы.Адрес ТВМ хранится в объекте в специальном внутреннем, невидимомдля программиста поле размером 2 байта (рис. 11.14).

Запись адреса ТВМ вэто поле происходит неявно при выполнении конструктора, поэтому попыт­ки вызовов виртуальных полиморфных методов до выполнения конструкто­ра приводят к ошибкам нарушения адресации и «зависанию» компьютера.338IL Иерархии классовПрограммаТВМ классаОбъект^Дополнительноеневидимое полеобъектаАдресавиртуальныхметодов»Рис.

11.14. Связь объекта с ТВМКак правило, в качестве конструктора используют метод инициализа­ции полей, так как его обычно вызывают в начале работы с объектом. Приповторном вызове конструктора никаких дополнительных действий не вы­полняется, метод работает как обычная процедура.Пример 11.5. Продолжение. Исправим ошибку предыдущего вариантапрограммы, объявив метод Square виртуальным полиморфным и используяметод Init в качестве конструктора.В а р и а н т 2-правильныйProgram easel;Type TRoomP-objectlength, width.real;{пояя: длина и ширина комнаты}junction Square:real; virtual; {метод определения площади}procedure Print;{метод вывода результата на экран}constructor Init(lyW:real); {конструктор}end;Function TRoomPSquare; {тело метода определения площади}BeginSquare: = length * width;End;Procedure TRoomPPrint; {тело метода вывода результатов}BeginWriteLnf'Площадь =', Square:6:2); {теперь вызов методапроисходит через ТВМ класса }End;Constructor TRoomPInit;{тело конструктора}Beginlength: "="1;width: =w;End;339Часть 2.

Объектно-ориентированное программированиеТуре TVRoomP = object(TRoomP)height:real;{дополнительное поле класса}function Square:real; virtual; {виртуальный полиморфный метод}constructor Init(lyWyh:real); {конструктор}end;Constructor TVRoomP.Init;BeginшЛт/е(^/«//(7,M^^;{инициализируем поля базового класса}height: =h; {инициализируем собстренное поле класса}End:Function TVRoomP Square;BeginSquare:=inherited Square+2'^height*(length+ width);End;Var A:TRoomP; B:TVRoomP; {объявляем объекты-переменные}BeginA.Init(3,5,5J); {конструируем объект A}A.Print; {выведет «Площадь = 17.85»}B.Init(3.5,5.],2,7); {конструируем объект В}B.Print; {выведет «Площадь = 94.64» - верно!!!}End,Определены три случая, когда использование позднего связывания обя­зательно:1) наследуемый метод для объекта производного класса вызывает метод,переопределенный в производном классе - пример такой ситуации рассмот­рен выше;2) объект производного класса через указатель базового класса обраща­ется к методу, переопределенному производным классом;3) процедура вызывает переопределенный метод для объекта производ­ного класса, переданного в процедуру через параметр-переменную, описан­ный как объект базового класса (данную ситуацию часто называют «проце­дурой с полиморфным объектом»).Примечание.

При использовании параметров-значений аргумент-объект копируется.При этом копируется объект типа параметра, т.е. базового. Следовательно, передать в проце­дуру объект производного класса не удастся.Собственно, все три случая сводятся к одному: обращение к полиморф­ному методу выполняется через указатель базового класса, которому можетбыть присвоен адрес объекта не только базового, но и производного класса.В теории программирования объект, адресуемый подобным указателем, по­лучил название полиморфного,34011.

Иерархии классовРассмотрим более подробно второй и тре­тий случаи и покажем, что действительно ис­ Площадь?Комната Дпользование сложного полиморфизма приме­нительно к ним обязательно.Пример 11.6. Разработать классы для реа­лизации двух динамических объектов: объектКомната Д должен отвечать на запрос о площа­ди, объект Трехмерная комната Д должен отве­Площадь?Трехмернаячать на запрос о площади стен и потолка (рис.комната Д11.15). Предусмотреть возмоэюиость обраще­ния к полям и методам производного классачерез указатель на базовый класс.Между классами прослеживается отноше­Рис.

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

Тип файла
PDF-файл
Размер
13,06 Mb
Тип материала
Учебное заведение
Неизвестно

Список файлов книги

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