Программирование >>  Дополнительные возможности наследования 

1 ... 186 187 188 [ 189 ] 190 191 192 ... 265


Создание модвАн UML no карточкам CRC

Каждой карточке будет соответствовать класс диаграммы UML. Пункты из столбца Ответственность становятся методами класса. Также в диаграмму переносятся все зафиксированные атрибуты класса. Определение класса с обратной стороны карточки помещается в документацию класса. На рис. 18.13 показана диаграмма отношения между классами Счет и Расчетный счет, атрибуты класса Расчетный счет взяты с соответствующей карточки CRC, показанной ниже.

Abstract Счет

Расчетный счет

Balance: Int DaysATMWithdrawal: int

GetBalanceO: int Deposit(int amount)(): void Transferln(lnt amount)() :bool TransfeЮut():int WrlteCtiecks(lnt amount)(): traol

Puc. 18.13. Отображение данных карточки CRC на диаграмме

Класс: Расчетный счет Надкласс: Счет Ответственность:

Отслеживать текущий остаток

Принимать и переводить депозиты Вьшавать чеки

Переводить деньги при снятии со счета

Сохранять баланс вьщачи кассового аппарата за текущий день

Сотрудничество:

Другие счета

Компьютерная система банка Устройство выдачи наличных

Отношения между классами

После того как классы будут отображены средствами UML, можно заняться отношениями между ними. Рассматриваются четыре основных вида отношений.

Обобщение.

Ассоциация.

Агрегирование.



Композиция.

Обобщение реализуется в С++ с помощью открытого наследования. Но с точки зрения проектирования больше внимания следует уделять не механизму, а семантике: что именно подразумевает это отношение. Мы уже говорили об обобщении на этапе анализа, но теперь рассмотрим этот вид отношений применительно к классам проекта. Нашей задачей будет вынести общие действия за границы взаимосвязанных классов в общий базовый класс, который инкапсулирует общую ответственность.

Таким образом, если обнаружено, что расчетный и депозитный счета используют одни и те же методы для перевода денег, то в базовый класс Счет можно перенести метод TransferFundsO. Чем больше методов будет сосредоточено в базовых классах, тем более полиморфным становится проект.

Одним из средств программирования, доступных в С++, но не в Java, является множественное наследование (однако Java имеет похожее, хотя и ограниченное средство, позволяющее создавать множественные интерфейсы). Это средство позволяет производить класс более чем от одного базового класса, добавляя переменные-члены и методы двух и более классов.

Опыт показывает, что множественное наследование надо использовать умеренно, так как оно может усложнить программный код проекта. Многие проблемы, вначале решаемые с помощью множественного наследования, теперь решаются путем агрегирования (вложения) классов. Тем не менее множественное наследование остается мощным средством программирования, от которого не следует огульно отказываться при разработке проектов.

Мпожвстввннов павлвдованвв против вложвноя

Является ли объект суммой его частей? Имеет ли смысл классы деталей автомобиля, такие Руль, Двери и Колеса, производить от общего класса Автомобиль, как показано на рис. 18.14?



Колесо

Автомобиль

Рис. 18.14. Возможно, но не умно

Важно вернуться к основам: открытое наследование должно всегда моделировать обобщение, т.е. производный класс должен быть уточнением базового класса, чего не скажешь о приведенном выше примере. Если требуется смоделировать отношение иметь (например, автомобиль имеет руль), то это делается с помощью агрегирования (рис. 18.15).



Диаграмма на рис. 18.15 показывает, что автомобиль имеет руль, четыре колеса и от двух до пяти дверей. Это более точная модель отношения автомобиля и его частей. Обратите внимание, что ромбик на диафамме не закрашен. Это потому, что отношение моделируется с помошью афегирования, а не композиции. Композиция подразумевает конфоль за временем жизни объекта вложенного класса. Хотя автомобиль имеет шины и дверь, но они могут существовать и до того, как станут частями автомобиля, и после того, как перестанут ими быть.


Рис. 18.15. Модель агрегирования

На рис. 18.16 показана модель композиции. Эта модель сообщает нам, что класс тело не только включает в себя (что можно было бы реализовать афегированием) голову, две руки и две ноги, но что эти объекты (голова, руки и ноги) будут созданы при создании тела и исчезнут вместе с ним. Иными словами, они не имеют независимого существования.


Рис. 18.16. Модель композиции

Дискриминаторы и силовые классы

Как можно спроектировать производство разных моделей автомобилей одной марки? Предположим, вас наняла фирма Acme Motors, которая производит петь автомобилей: Pluto (компактный малолифажный автомобиль для поездок за покупками),



1 ... 186 187 188 [ 189 ] 190 191 192 ... 265

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика