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

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

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

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

. .class CheckingAccount : public BankAccount ...class Stock : public Security ...class Bond : public Security ...Рис. 3-7. Множественное наследованиеПроектирование структур классов со множественным наследованием трудная задача, решаемая путем последовательных приближений. Есть двеспецифические для множественного наследования проблемы - как разрешитьконфликты имен между суперклассами и что делать с повторнымнаследованием.Конфликт имен происходит, когда в двух или более суперклассахслучайно оказывается элемент (переменная или метод) с одинаковым именем.Представьте себе, что как Asset, так и Insurableltem содержат атрибутpresentValue, обозначающий текущую стоимость. Так как классRealEstate наследует обоим этим классам, как понимать наследование двухопераций с одним и тем же именем? Это, на самом деле, главная бедамножественного наследования: конфликт имен может ввестидвусмысленность в поведение класса с несколькими предками.Борются с этим конфликтом тремя способами.

Во-первых, можносчитать конфликт имен ошибкой и отвергать его при компиляции (так делаютSmalltalk и Eiffel, хотя в Eiffel конфликт можно разрешить, исправив имя).Во-вторых, можно считать, что одинаковые имена означают одинаковыйатрибут (так делает CLOS). В третьих, для устранения конфликта разрешаетсядобавить к именам префиксы, указывающие имена классов, откуда онипришли. Такой подход принят в C++.16О второй проблеме, повторном наследовании, Мейер пишетследующее: "Одно тонкое затруднение при использовании множественногонаследования встречается, когда один класс является наследником другого понескольким линиям. Если в языке разрешено множественное наследование,рано или поздно кто-нибудь напишет класс D, который наследует от в и с,которые, в свою очередь, наследуют от А.

Эта ситуация называетсяповторным наследованием, и с ней нужно корректно обращаться" [41].Рассмотрим следующий класс:class MutualFund :public Stock,public Bond ...который дважды наследует от класса security.Проблема повторного наследования решается тремя способами. Вопервых, можно его запретить, отслеживая при компиляции. Так сделано вязыках Smalltalk и Eiffel (но в Eiffel, опять-таки допускается переименованиедля устранения неопределенности).

Во-вторых, можно явно развести двекопии унаследованного элемента, добавляя к именам префиксы в виде именикласса-источника (это один из подходов, принятых в C++). В-третьих, можнорассматривать множественные ссылки на один и тот же класс, какобозначающие один и тот же класс. Так поступают в C++, где повторяющийсясуперкласс определяется как виртуальный базовый класс. Виртуальныйбазовый класс появляется, когда какой-либо подкласс именует другой класссвоим суперклассом и отмечает этот суперкласс как виртуальный, чтобыпоказать, что это - общий (shared) класс.

Аналогично, в языке CLOS повторнонаследуемые классы "обобществляются" с использованием механизма,называемого список следования классов. Этот список заводят для каждогонового класса, помещая в него сам этот класс и все его суперклассы безповторений на основе следующих правил:• класс всегда предшествует своему суперклассу;• каждый класс сам определяет порядок следования своихнепосредственных родителей.В результате граф наследования оказывается плоским, дублированиеустраняется, и появляется возможность рассматривать результирующуюиерархию как иерархию с одиночным наследованием [43]. Это весьманапоминает топологическую сортировку классов.

Если она возможна, топовторное наследование допускается. При этом теоретически могутсуществовать несколько равноправных результатов сортировки, но алгоритмтак или иначе выдает какой-то один из них. Если же сортировка невозможна(например, в структуре возникают циклы), то класс отвергается.При множественном наследовании часто используется прием созданияпримесей (mixin). Идея примесей происходит из языка Flavors: можнокомбинировать (смешивать) небольшие классы, чтобы строить классы с болеесложным поведением. Хендлер пишет об этом так: "примесь синтаксическиничем не отличается от класса, но назначение их разное.

Примесь непредназначена для порождения самостоятельно используемых экземпляров она смешивается с другими классами" [44]. На рис. 3-7 классыInsurableltem и interestBearingltem - это примеси. Ни один из них не16В C++ конфликт имен элементов подкласса может быть разрешен полнойквалификацией имени члена класса. Функции-члены с одинаковыми именами исигнатурами семантическими считаются идентичными.может существовать сам по себе, они используются для придания смысладругим классам.17 Таким образом, примесь - это класс, выражающий неповедение, а одну какую-то хорошо определенную повадку, которую можнопривить другим классам через наследование. При этом повадка эта обычноортогональна собственному поведению наследующего ее класса. Классы,сконструированные целиком из примесей, называют агрегатными.Множественный полиморфизм.

Вернемся к одной из функцийчленов класса DisplayIem:virtual void draw();Эта операция изображает объект на экране в некотором контексте. Онаобъявлена виртуальной, то есть полиморфной, переопределяемойподклассами. Когда эту операцию вызывают для какого-то объекта,программа определяет, что, собственно, выполнять (см. врезку выше). Этоодиночный полиморфизм в том смысле, что смысл сообщения зависит толькоот одного параметра, а именно, объекта, для которого вызывается операция.На самом деле операция draw должна бы зависеть от характеристикиспользуемой системы отображения, в частности от графического режима.Например, в одном случае мы хотим получить изображение с высокимразрешением, а в другом - быстро получить черновое изображение.

Можноввести две различных операции, скажем, drawGraphic и drawText, но это несовсем то, что хотелось бы. Дело в том, что каждый раз, когда требуетсяучесть новый вид устройства, его надо проводить по всей иерархиинадклассов для класса Displayltem.В CLOS есть так называемые мультиметоды. Они полиморфны, то естьих смысл зависит от множества параметров (например, от графическогорежима и от объекта). В C++ мультиметодов нет, поэтому там используетсяидиома так называемый двойной диспетчеризации.Например, мы могли бы вести иерархию устройств отображенияинформации от базового класса DisplayDevice, а атем определить методкласса Displayltem так:virtual void draw(DisplayDevice&);При реализации этого метода мы вызываем графические операции,которые полиморфны относительно переданного параметра типаDisplayltem, таким образом происходит двойная диспетчеризация: drawсначала демонстрирует полиморфное поведение в зависимости от того, ккакому подклассу класса Displayltem принадлежит объект, а затемполиморфизм проявляется в зависимости от того, к какому подклассу классаDisplayDevice принадлежит аргумент.

Эту идиому можно продолжить домножественной диспетчеризации.АгрегацияПример. Отношение агрегации между классами имеетнепосредственное отношение к агрегации между их экземплярами.Рассмотрим вновь класс TemperatureController:class TemperatureController {public:TemperatureController(Location) ;~TemratureController();void process(const TemperatureRamp&);Minute schedule(const TemperatureRamp&) const;17Для языка CLOS при обогащении поведения существующих первичных методовобычной практикой является строить примесь, используя только : before- и : afterметоды.private:Heater h;};Рис.

3-8. АгрегацияКак явствует из рис. 3-8, класс TemperatureController это,несомненно, целое, а экземпляр класса Heater - одна из его частей.Совершенно такое же отношение агрегации между экземплярами этих классовпоказано на рис. 3-3.Физическое включение. В случае класса TemperatureControllerмы имеем агрегацию по значению; эта разновидность физического включенияозначает, что объект класса Heater не существует отдельно от объемлющегоэкземпляра класса TemperatureController.Менее обязывающим является включение по ссылке. Мы могли быизменить закрытую часть TemperatureController так:18Heater* h;В этом случае класс TemperatureController по-прежнему означаетцелое, но его часть, экземпляр класса Heater, содержится в целом косвенно.Теперь эти объекты живут отдельно друг от друга: мы можем создавать иуничтожать экземпляры классов независимо.

Чтобы избежать структурнойзависимости через ссылки важно придерживаться какой-то договоренностиотносительно создания и уничтожения объектов, ссылки на которые могутсодержаться в разных местах. Нужно, чтобы это делал кто-то один.Агрегация является направленной, как и всякое отношение"целое/часть". Объект Heater входит в объект TemperatureController, и ненаоборот. Физическое вхождение одного в другое нельзя "зациклить", а вотуказатели - можно (каждый из двух объектов может содержать указатель надругой).19Конечно, как уже говорилось, агрегация не требует обязательногофизического включения, ни по значению, ни по ссылке.

Например, акционервладеет акциями, но они не являются его физической частью. Более того,время жизни этих объектов может быть совершенно различным, хотяконцептуально отношение целого и части сохраняется и каждая акция входитв имущество своего акционера. Поэтому агрегация может быть оченькосвенной. Например, объект класса Shareholder (акционер) можетсодержать ключ записи об этом акционере в базе данных акций. Это тожеагрегация без физического включения. "Лакмусовая бумажка" для выявленияагрегации такова: если (и только если) налицо отношение18В качестве альтернативы мы могли бы описать h как ссылку на нагреватель(Heater& в C++), в этом случае семантика инициализации и модификации этогообъекта будет совершенно отличной от семантики указателей.19Ассоциация часто может быть заменена циклической агрегацией или циклическимиотношениями использования. Однако чаще ассоциация, которая по определениюпредполагает двунаправленность, во время проектирования превращается в простуюагрегацию или отношение использования, выявляя ограничения на направлениеассоциации.Рис.

3-9. Отношение использования"целое/часть" между объектами, их классы должны находиться вотношении агрегации друг с другом.Часто агрегацию путают с множественным наследованием.Действительно, в C++ скрытое (защищенное или закрытое) наследованиепочти всегда можно заменить скрытой агрегацией экземпляра суперкласса.Решая, с чем вы имеете дело - с наследованием или агрегацией - будьтеосторожны. Если вы не уверены, что налицо отношение общего и частного (isа), вместо наследования лучше применить агрегацию или что-нибудь еще.ИспользованиеПример. В недавнем примере объекты rampController иgrowingRamp иллюстрировали связь между объектами, которую мыпредставляли в виде отношения использования между их классамиTemperatureController и TemperatureRamp.class TemperatureController {public:TemperatureController(Location) ;~TemperatureController();void process(const TemperatureRamp&);Minute schedule(const TemperatureRamp&) const;private:Heater h;};Класс TemperatureRamp упомянут как часть сигнатуры функции-члена process;это дает нам основания сказать, что класс TemperatureControllerпользуется услугами класса TemperatureRamp.Клиенты и серверы.

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

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

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