Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







Отображение атрибутов и операций на диаграммах





На диаграммах могут быть воспроизведены не только классы в целом, но и их опе­рации и атрибуты. Зачастую диаграммы классов конструируются именно с такой це­лью— зафиксировать характеристики структуры и поведения классов, принадлежа­щих определенному пакету. На диаграммах подобного рода связи обычно опускаются.

 

Классы ассоциаций

 

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

Рассмотрим пример. Студент вправе зарегистрироваться на несколько курсов (не более четырех), а занятия по каждому курсу могут посещать от трех до десяти студен­тов. Студент обязан получить отметку по каждому из пройденных имкурсов. Где со­хранять подобную порцию информации? Она не принадлежит объекту "студент" не­посредственно, так как типичный студент по тем или иным курсам получает, вероят­но, различные отметки. Элемент данных не может принадлежать и объекту «предложение курса», поскольку отметки студентов по одному и тому же курсу обычно также различаются. Порция информации, очевидно, соотносится с парой объектов студент" и "предложение курса". Подобное условие может быть промоделировано с помощью класса ассоциаций (association class). Класс ассоциаций (назовем его в данном случае как "отметка") ведет себя так же, как и любой другой класс, а потому и он разумеется, может быть снабжен связями: продолжая наш пример, достаточно допустить, что в конце каждого семестра очередная страница зачетной книжки студента заполняется полученными студентом отметками и представляется в системе в виде объекта соответствующего "вспомогательного" класса "зачетная книжка".



или принимается активным субъектом (человеком-пользователем или внешней сис­темой), оно не обязательно преобразуется в операцию.

Многие из атрибутов класса нетрудно "найти", изучив постановку задачи и потоки событий, предусматриваемые теми или иными вариантами использования. Порции данных, пригодные на роль атрибутов, могут быть выявлены и в процессе обдумыва­ния определения класса. Наконец, неплохим "поставщиком" атрибутов класса спо­собны стать результаты исследования предметной области в целом.

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

Лекция №6

Понятие наследования

Механизм наследования (inheritance) позволяет определить такое соотношение между классами, когда один класс обладает структурой и поведением, характерными для ряда других классов. При создании подкласса (subclass), или производного класса (derived class), на основе одного или нескольких базовых классов (base classes), или суперклассов (superclasses), возникает иерархия наследования. Подкласс получает в свое распоряжение псе атрибуты, операции и связи, определенные в каждом су­перклассе. Атрибуты и операции объявляются на наивысшем уровне иерархии, на­чиная с которого они находят практическое применение, и наследуются всеми классами, расположенными на нижних уровнях иерархии. Подкласс можно расши­рить за счет включения дополнительных атрибутов и операций. Подклассу дается право собственной реализации любой унаследованной операции. Поскольку связь наследования не является связью между различными объектами, ее никогда не име­нуют, не определяют роли и не устанавливают признаки множественности.

Количество уровней иерархии наследования классов формально не ограничивает­ся. Однако практический опыт показывает, что типичные иерархии классов C++ со­держат от трех до пяти уровней. Для приложений, написанных на языке программи­рования Smalltalk, этот показатель несколько выше.

Реализация принципов наследования является ключевой предпосылкой возмож­ности повторного использования кода: достаточно, создав класс для одного приложе­ния, сконструировать на его основе определенный производный класс, дополненный требуемыми функциями и пригодный для применения в другом приложении .

Существуют два способа реализации модели наследования — обобщение и специа­лизация. Оба метода используются при разработке практически любой объектно-ориентированной системы.

 

Обобщение

 

Подход, связанный с обобщением (generalization), предполагает создание базового класса, который инкапсулирует структуру и поведение, общие для нескольких буду­щих производных классов. Метод обобщения находит весьма широкое применение на начальных этапах проектирования, когда создаваемые классы моделируют основопо­лагающие сущности реального мира. Классы проверяются на наличие схожих струк­турных особенностей (атрибутов) и характеристик поведения (операций). Например, классы "профессор" и "студент" могут обладать одинаковыми по назначению атрибу­тами "имя". Следует иметь п виду и возможную синонимическую общность наимено­ваний атрибутов и операций, когда истинный смысл одинаковых понятий скрыт под различными обозначениями. Пусть, например, класс "студент" снабжен атрибутом "номер студента", а класс "профессор" — атрибутом "номер профессора". Если оба ат­рибута предназначены для хранения однотипных значений (скажем, целочисленных величин в интервале 1-9999), тогда различные "частные" наименования атрибутов уместно заменить одним, более "общим" (в данном случае подойдет выражение "системный номер"). Это позволяет говорить о целесообразности создания базового класса "пользователь", лежащего в основе классов "студент" и "профессор".

 

Специализация

 

Метод специализации (specialization) предусматривает возможность конструирова­ния производного класса, тем или иным образом изменяющего структуру и/или по­ведение базового класса. Подобный способ реализации механизма наследования при­меняется в ситуациях, когда суперклассы, служащие отправной точкой для дальнейшего анализа и моделирования, уже существуют и их характеристики в рамках подклассов "приспосабливаются" для решения новых задач. Пусть, например, функции системы ре­гистрации университетских курсов необходимо расширить таким образом, чтобы учесть возможность бесплатного обучения малоимущих граждан и лиц старшего воз­раста. В этом случае иерархию, в основе которой лежит класс "пользователь", следо­вало бы пополнить соответствующим производным классом "льготник".

Еще раз напомним, что операция суперкласса может быть переопределена в под­классе. Однако подкласс не вправе ограничивать функции или структуру суперкласса.

Иерархии наследования

 

Основанием для специализации, т.е. поводом к созданию подклассов, служит некий отличительный признак, проявляющийся в конечном множестве значений, которые за­служивают отображения в производных классах. Одним из таких признаков для класса "курс" является место проведения занятий — возможно, целесообразным оказалось бы создание двух подклассов, "курс в университете" и "курс выездной практики", "уточняющих" поведение и структуру базового класса "курс". Связь наследования изо­бражается в виде дерева, корневой вершиной которого служит суперкласс, а промежу­точными и оконечными вершинами — подклассы, "развивающие" тот или иной отличи­тельный признак. Еще один очевидный пример класса, производного от "курс", — класс "обязательный курс". Этот подкласс не является частью указанного выше дерева насле­дования, поскольку связан с совершенно другим отличительным признаком, который можно было бы назвать как "тип курса". Казовые классы с несколькими отличительными признаками заслуживают особого внимания: что произойдет, например, в том случае, если некий обязательный курс должен преподаваться в ходе выездной практики? Мож­но ли в этом случае говорить о ситуации множественного наследования? Следует ли воспользоваться механизмом агрегирования? По мере развития проекта ответы на по­добные вопросы должны приводить к получению все более точной и адекватной модели. Как создать диаграмму иерархии наследования классов

1. Открыть окно диаграммы классов, предназначенной для отображения
связей наследования.

2. Разместить на диаграмме требуемый класс.

3. Повторить действия, указанные в п. 2, для включения в диаграмму всех
остальных классов, составляющих иерархию.

4. Щелкнуть на пиктограмме Generalization панели инструментов Diagram.
(Если пиктограмма на панели не отображается, расположить курсор мы­
ши над панелью, щелкнуть правой кнопкой, выбрать элемент Customize
контекстного меню и настроить панель инструментов средствами одно­
именного диалогового окна.)

В окне диаграммы щелкнуть на символе, представляющем подкласс, и по­строить линию связи в направлении символа суперкласса.

6. Повторить действия, указанные в пп. 4, 5, для связывания суперкласса с другими подклассами.

Две отдельные стрелки линий наследования, расположенные на одном уровне дерева, можно совместить в одну с помощью техники перетаскивания.

Для отображения стереотипов классов на подобных диаграммах удобно использо­вать режимы None, Label или Decoration, поскольку в ином случае стрелки, воспроиз­водящие связи наследования, могут быть скрыты пиктограммой.

Как только суперкласс создан, определенные атрибуты, операции и связи, общие для всех подклассов, подлежат переносу на наивысший возможный уровень иерар­хии. Что именно следует переносить? Еще раз обратимся к дереву классов, производ­ных от базового класса "пользователь".

Предположим, что значения каждого из атрибутов "имя" и "системный номер" подклассов "студент" и "профессор" имеют одинаковый формат представления. В та­ком случае атрибуты можно смело перенести в состав суперкласса "пользователь". Помимо того, оба производных класса связаны с классом "предложение курса". Как быть с этими связями? Существует две возможности:

• оставить связи на уровне подклассов;

• переместить связь на уровень суперкласса, снабдив ее "суммарным" признаком
множественности, свидетельствующим о том, что один объект "предложение
курса" может соотноситься с 4-11 объектами "пользователь"; в этом случае
в модель следует ввести ограничение, предусматривающее, что один из объек­тов "пользователь" должен быть объектом "профессор".

Какой из способов верен? Корректны оба. Какой лучше? Это зависит от обстоя­тельств. Если объект "предложение курса" необходим для получения информации о том, кто из студентов и профессоров связан с определенным курсом, тогда придется кстати второй вариант, предполагающий существование единого множества элемен­тов данных. Если же в тот или иной момент времени требуется получить сведения ли­бо о студентах, либо о профессоре, но не те и другие одновременно, лучшим, вероят­но, окажется первый способ. Выбор решения зависит от результатов тщательного изучения вариантов использования системы и их отдельных сценариев.

 









Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2018 zdamsam.ru Размещенные материалы защищены законодательством РФ.