Главная » Просмотр файлов » Гради Буч - Объектно-ориентированный анализ и проектирование с примерами приложений на С++

Гради Буч - Объектно-ориентированный анализ и проектирование с примерами приложений на С++ (1158635), страница 27

Файл №1158635 Гради Буч - Объектно-ориентированный анализ и проектирование с примерами приложений на С++ (Гради Буч - Объектно-ориентированный анализ и проектирование с примерами приложений на С++) 27 страницаГради Буч - Объектно-ориентированный анализ и проектирование с примерами приложений на С++ (1158635) страница 272019-09-18СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

Наличие механизманаследования отличает объектно-ориентированные языки от объектных.Подкласс обычно расширяет или ограничивает существующуюструктуру и поведение своего суперкласса. Например, подклассGuardedQueue может добавлять к поведению суперкласса Queue операции,которые защищают состояние очереди от одновременного изменениянесколькими независимыми потоками. Обратный пример: подклассUnselectableDisplayltem может ограничить поведение своего суперклассаDisplayitem, запретив выделение объекта на экране. Часто подклассыделают и то, и другое.Отношения одиночного наследования от суперкласса TelemetryDataпоказаны на рис.

3-5. Стрелки обозначают отношения общего к частному. Вчастности, Cameradata - это разновидность класса SensorData, который всвою очередь является разновидностью класса TelemetryData. Такой же типиерархии характерен для семантических сетей, которые часто используютсяспециалистами по распознаванию образов и искусственному интеллекту дляорганизации баз знаний [25]. В главе 4 мы покажем, что правильнаяорганизация иерархии абстракций - это вопрос логической классификации.Можно ожидать, что для некоторых классов на рис.

3-5 будут созданыэкземпляры, а для других - нет. Наиболее вероятно образование объектовсамых специа-Рис. 3-5. Одиночное наследованиелизированных классов ElectricalData и SpectrometerData (такиеклассы называют конкретными классами, или листьями иерархическогодерева). Образование объектов из классов, занимающих промежуточноеположение (SensorData или тем более TelemetryData), менее вероятно.Классы, экземпляры которых не создаются, называются абстрактными.Ожидается, что подклассы абстрактных классов доопределят их дожизнеспособной абстракции, наполняя класс содержанием. В языке Smalltalkразработчик может заставить подкласс переопределить метод, помещая вреализацию метода суперкласса вызов метода SubclassResponsibility.Если метод не переопределен, то при попытке выполнить его генерируетсяошибка.

Аналогично, в C++ существует возможность объявлять функциичисто виртуальными. Если они не переопределены, экземпляр такого классаневозможно создать.Самый общий класс в иерархии классов называется базовым. Вбольшинстве приложений базовых классов бывает несколько, и они отражаютнаиболее общие абстракции предметной области. На самом деле, особенно вC++, хорошо сделанная структура классов - это скорее лес из деревьевнаследования, чем одна многоэтажная структура наследования с однимкорнем. Но в некоторых языках программирования определен базовый класссамого верхнего уровня, который является единым суперклассом для всехостальных классов.

В языке Smalltalk эту роль играет класс object.У класса обычно бывает два вида клиентов [26]:• экземпляры• подклассы.Часто полезно иметь для них разные интерфейсы [27]. В частности, мыхотим показать только внешне видимое поведение для клиентов-экземпляров,но нам нужно открыть служебные функции и представления клиентамподклассам. Этим объясняется наличие открытой, защищенной и закрытойчастей описания класса в языке C++: разработчик может четко разделить,какие элементы класса доступны Для экземпляров, а какие для подклассов. Вязыке Smalltalk степень такого разделения меньше: данные видимы дляподклассов, но не для экземпляров, а методы общедоступны (можно ввестизакрытые методы, но язык не обеспечивает их защиту).Есть серьезные противоречия между потребностями наследования иинкапсуляции. В значительной мере наследование открывает наследующемуклассу некоторые секреты. На практике, чтобы понять, как работает какой-токласс, часто надо изучить все его суперклассы в их внутренних деталях.Наследование подразумевает, что подклассы повторяют структуры ихсуперклассов.

В предыдущем примере экземпляры класса ElectricalDataсодержат элементы структуры суперкласса (id и timeStamp) и болееспециализированные элементы (fuelCelllVoltage, fuelCell2Voltage,fuelCelllAmperes, fuelCell2Amperes).11Поведение суперклассов также наследуется. Применительно кобъектам класса ElectricalData можно использовать операцииcurrentTime (унаследована от суперкласса), currentPower (определена вклассе) и transmit (переопределена в подклассе).

В большинстве языковдопускается не только наследование методов суперкласса, но такжедобавление новых и переопределение существующих методов. В Smalltalkлюбой метод суперкласса можно переопределить в подклассе.В C++ степень контроля за этим несколько выше. Функция,объявленная виртуальной (функция transmit в предыдущем примере), можетбыть в подклассе переопределена, а остальные (currentTime) - нет.Одиночный полиморфизм. Пусть функция transmit классаTelemetryData реализована следующим образом:void TelemetryData::transmit(){// передать id// передать timeStamp};В классе ElectricalData та же функция переопределена:void ElectricalData::transmit(){TelemetryData::transmit();// передать напряжение// передать силу тока};Эта функция сначала вызывает одноименную функцию суперкласса спомощью ее явно квалифицированного имени TelemetryData:: transmit ().Та передаст заголовок пакета (id и timeStamp), после чего в подклассепередаются его собственные данные.Определим теперь экземпляры двух описанных выше классов:TelemetryData telemetry;ElectricalData electrical(5.О, -5.0, 3.0, 7.0);Теперь определим свободную процедуру:void transmitFreshData (TelemetryData& d, const Time& t){if (d.currentTime() >= t)d.transmit() ;);Что произойдет, если выполнить следующие два оператора?transmitFreshData(telemetry, Time(60));transmitFreshData(electrical, Time(120));В первом операторе будет передан уже известный нам заголовок.

Вовтором будет передан он же, плюс четыре числа в формате с плавающейточкой, содержащие результаты измерений электрических параметров.Почему это так? Ведь функция transmitFreshData ничего не знает о классеобъекта, она просто выполняет d,transmit ()! Это был примерполиморфизма. Переменная d может обозначать объекты разных классов. У11Некоторые языки объектно-ориентированного программирования, главным образомэкспериментальные, позволяют подклассу сокращать структуру его суперкласса.этих классов есть общий суперкласс и они, хотя и по разному, могутреагировать на одно и то же сообщение, одинаково понимая его смысл.Карделли и Вегнер заметили, что "традиционные типизированныеязыки типа Pascal основаны на той идее, что функции и процедуры, аследовательно, и операнды должны иметь определенный тип.

Это свойствоназывается мономорфизмом, то есть каждая переменная и каждое значениеотносятся к одному определенному типу. В противоположностьмономорфизму полиморфизм допускает отнесение значений и переменных кнескольким типам" [28]. Впервые идею полиморфизма ad hoc описал Страчи[29], имея в виду возможность переопределять смысл симво-лов, таких, как"+", сообразно потребности. В современном программировании мы называемэто перегрузкой. Например, в C++ можно определить несколько функций содним и тем же именем, и они будут автоматически различаться поколичеству и типам своих аргументов.

Совокупность этих признаковназывается сигнатурой функции; в языке Ada к этому списку добавляется типвозвращаемого значения. Страчи говорил также о параметрическомполиморфизме, который мы сейчас называем просто полиморфизмом.При отсутствии полиморфизма код программы вынуждено содержитмножество операторов выбора case или switch. Например, на языке Pascalневозможно образовать иерархию классов телеметрических данных; вместоэтого придется определить одну большую запись с вариантами, включающуювсе разновидности данных. Для выбора варианта нужно проверить метку,определяющую тип записи. На языке Pascal процедура TransmitFreshDataможет быть написана следующим образом:constElectrical = 1;Propulsion =2;Spectrometer = 3;Procedure Transmit_Presh_Data(TheData : Data; The_Tiime :Time);beginif (The_Data.Current_Time >= The_Time)thencase TheData.Kind ofElectrical:Transmit_Electrical_Data(The_Data);Propulsion:Transmit_Propulsion_Data(The_Data);endend;Чтобы ввести новый тип телеметрических данных, нужномодифицировать эту вариантную запись, добавив новый тип в каждыйоператор case.

В такой ситуации увеличивается вероятность ошибок, и проектстановится нестабильным.Наследование позволяет различать разновидности абстракций, имонолитные типы становятся не нужны. Каплан и Джонсон отметили, что"полиморфизм наиболее целесообразен в тех случаях, когда несколько классовимеют одинаковые протоколы" [30]. Полиморфизм позволяет обойтись безоператоров выбора, поскольку объекты сами знают свой тип.Наследование без полиморфизма возможно, но не очень полезно. Этовидно на примере Ada, где можно объявлять производные типы, но из-замономорфизма языка операции жестко задаются на стадии компиляции.Полиморфизм тесно связан с механизмом позднего связывания.

Приполиморфизме связь метода и имени определяется только в процессевыполнения программ. В C++ программист имеет возможность выбиратьмежду ранним и поздним связыванием имени с операцией. Если функциявиртуальная, связывание будет поздним и, следовательно, функцияполиморфна. Если нет, то связывание происходит при компиляции и ничегоизменить потом нельзя. Этому вопросу посвящена следующая врезка.Наследование и типизация. Рассмотрим еще раз переопределениефункции transmit:void ElectricalData::transmit(){TelemetryData:: transmit ();// передать напряжение// передать силу тока};В большинстве объектно-ориентированных языков программированияпри реализации метода подкласса разрешается вызывать напрямую методкакого-либо суперкласса. Как видно из примера, это допускается и в томслучае, если метод подкласса имеет такое же имя и фактическипереопределяет метод суперкласса.

В Smalltalk метод вышестоящего классавызывают с помощью ключевого слова super, при этом вызывающий можетуказывать на самого себя с помощью ключевого слова self. В C++ методлюбого достижимого вышестоящего класса можно вызывать, добавляя имякласса в качестве префикса, формируя квалифицированное имя метода (какTelemetryData:: transmit () в нашем примере). Вызывающий объект можетссылаться на себя с помощью предопределенного указателя this.На практике метод суперкласса вызывается до или последополнительных действий.

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

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

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