|
Отображение атрибутов и операций на диаграммах ⇐ ПредыдущаяСтр 7 из 7 На диаграммах могут быть воспроизведены не только классы в целом, но и их операции и атрибуты. Зачастую диаграммы классов конструируются именно с такой целью— зафиксировать характеристики структуры и поведения классов, принадлежащих определенному пакету. На диаграммах подобного рода связи обычно опускаются.
Классы ассоциаций
Связь классов, в свою очередь, может обладать собственными структурой и поведением — иногда приходится иметь дело с элементами информации, относящимися к паре объектов, а не к каждому отдельному объекту. Рассмотрим пример. Студент вправе зарегистрироваться на несколько курсов (не более четырех), а занятия по каждому курсу могут посещать от трех до десяти студентов. Студент обязан получить отметку по каждому из пройденных им курсов. Где сохранять подобную порцию информации? Она не принадлежит объекту "студент" непосредственно, так как типичный студент по тем или иным курсам получает, вероятно, различные отметки. Элемент данных не может принадлежать и объекту «предложение курса», поскольку отметки студентов по одному и тому же курсу обычно также различаются. Порция информации, очевидно, соотносится с парой объектов студент" и "предложение курса". Подобное условие может быть промоделировано с помощью класса ассоциаций (association class). Класс ассоциаций (назовем его в данном случае как "отметка") ведет себя так же, как и любой другой класс, а потому и он разумеется, может быть снабжен связями: продолжая наш пример, достаточно допустить, что в конце каждого семестра очередная страница зачетной книжки студента заполняется полученными студентом отметками и представляется в системе в виде объекта соответствующего "вспомогательного" класса "зачетная книжка". или принимается активным субъектом (человеком-пользователем или внешней системой), оно не обязательно преобразуется в операцию. Многие из атрибутов класса нетрудно "найти", изучив постановку задачи и потоки событий, предусматриваемые теми или иными вариантами использования. Порции данных, пригодные на роль атрибутов, могут быть выявлены и в процессе обдумывания определения класса. Наконец, неплохим "поставщиком" атрибутов класса способны стать результаты исследования предметной области в целом. Связь классов может обладать собственными структурой и поведением - иногда приходится иметь дело с элементами информации, относящимися к паре объектов, а не к каждому отдельному объекту. Характеристики связи фиксируются в определении класса ассоциаций. Лекция №6 Понятие наследования Механизм наследования (inheritance) позволяет определить такое соотношение между классами, когда один класс обладает структурой и поведением, характерными для ряда других классов. При создании подкласса (subclass), или производного класса (derived class), на основе одного или нескольких базовых классов (base classes), или суперклассов (superclasses), возникает иерархия наследования. Подкласс получает в свое распоряжение псе атрибуты, операции и связи, определенные в каждом суперклассе. Атрибуты и операции объявляются на наивысшем уровне иерархии, начиная с которого они находят практическое применение, и наследуются всеми классами, расположенными на нижних уровнях иерархии. Подкласс можно расширить за счет включения дополнительных атрибутов и операций. Подклассу дается право собственной реализации любой унаследованной операции. Поскольку связь наследования не является связью между различными объектами, ее никогда не именуют, не определяют роли и не устанавливают признаки множественности. Количество уровней иерархии наследования классов формально не ограничивается. Однако практический опыт показывает, что типичные иерархии классов C++ содержат от трех до пяти уровней. Для приложений, написанных на языке программирования Smalltalk, этот показатель несколько выше. Реализация принципов наследования является ключевой предпосылкой возможности повторного использования кода: достаточно, создав класс для одного приложения, сконструировать на его основе определенный производный класс, дополненный требуемыми функциями и пригодный для применения в другом приложении. Существуют два способа реализации модели наследования — обобщение и специализация. Оба метода используются при разработке практически любой объектно-ориентированной системы.
Обобщение
Подход, связанный с обобщением (generalization), предполагает создание базового класса, который инкапсулирует структуру и поведение, общие для нескольких будущих производных классов. Метод обобщения находит весьма широкое применение на начальных этапах проектирования, когда создаваемые классы моделируют основополагающие сущности реального мира. Классы проверяются на наличие схожих структурных особенностей (атрибутов) и характеристик поведения (операций). Например, классы "профессор" и "студент" могут обладать одинаковыми по назначению атрибутами "имя". Следует иметь п виду и возможную синонимическую общность наименований атрибутов и операций, когда истинный смысл одинаковых понятий скрыт под различными обозначениями. Пусть, например, класс "студент" снабжен атрибутом "номер студента", а класс "профессор" — атрибутом "номер профессора". Если оба атрибута предназначены для хранения однотипных значений (скажем, целочисленных величин в интервале 1-9999), тогда различные "частные" наименования атрибутов уместно заменить одним, более "общим" (в данном случае подойдет выражение "системный номер"). Это позволяет говорить о целесообразности создания базового класса "пользователь", лежащего в основе классов "студент" и "профессор".
Специализация
Метод специализации (specialization) предусматривает возможность конструирования производного класса, тем или иным образом изменяющего структуру и/или поведение базового класса. Подобный способ реализации механизма наследования применяется в ситуациях, когда суперклассы, служащие отправной точкой для дальнейшего анализа и моделирования, уже существуют и их характеристики в рамках подклассов "приспосабливаются" для решения новых задач. Пусть, например, функции системы регистрации университетских курсов необходимо расширить таким образом, чтобы учесть возможность бесплатного обучения малоимущих граждан и лиц старшего возраста. В этом случае иерархию, в основе которой лежит класс "пользователь", следовало бы пополнить соответствующим производным классом "льготник". Еще раз напомним, что операция суперкласса может быть переопределена в подклассе. Однако подкласс не вправе ограничивать функции или структуру суперкласса. Иерархии наследования
Основанием для специализации, т.е. поводом к созданию подклассов, служит некий отличительный признак, проявляющийся в конечном множестве значений, которые заслуживают отображения в производных классах. Одним из таких признаков для класса "курс" является место проведения занятий — возможно, целесообразным оказалось бы создание двух подклассов, "курс в университете" и "курс выездной практики", "уточняющих" поведение и структуру базового класса "курс". Связь наследования изображается в виде дерева, корневой вершиной которого служит суперкласс, а промежуточными и оконечными вершинами — подклассы, "развивающие" тот или иной отличительный признак. Еще один очевидный пример класса, производного от "курс", — класс "обязательный курс". Этот подкласс не является частью указанного выше дерева наследования, поскольку связан с совершенно другим отличительным признаком, который можно было бы назвать как "тип курса". Казовые классы с несколькими отличительными признаками заслуживают особого внимания: что произойдет, например, в том случае, если некий обязательный курс должен преподаваться в ходе выездной практики? Можно ли в этом случае говорить о ситуации множественного наследования? Следует ли воспользоваться механизмом агрегирования? По мере развития проекта ответы на подобные вопросы должны приводить к получению все более точной и адекватной модели. Как создать диаграмму иерархии наследования классов 1. Открыть окно диаграммы классов, предназначенной для отображения 2. Разместить на диаграмме требуемый класс. 3. Повторить действия, указанные в п. 2, для включения в диаграмму всех 4. Щелкнуть на пиктограмме Generalization панели инструментов Diagram. В окне диаграммы щелкнуть на символе, представляющем подкласс, и построить линию связи в направлении символа суперкласса. 6. Повторить действия, указанные в пп. 4, 5, для связывания суперкласса с другими подклассами. Две отдельные стрелки линий наследования, расположенные на одном уровне дерева, можно совместить в одну с помощью техники перетаскивания. Для отображения стереотипов классов на подобных диаграммах удобно использовать режимы None, Label или Decoration, поскольку в ином случае стрелки, воспроизводящие связи наследования, могут быть скрыты пиктограммой. Как только суперкласс создан, определенные атрибуты, операции и связи, общие для всех подклассов, подлежат переносу на наивысший возможный уровень иерархии. Что именно следует переносить? Еще раз обратимся к дереву классов, производных от базового класса "пользователь". Предположим, что значения каждого из атрибутов "имя" и "системный номер" подклассов "студент" и "профессор" имеют одинаковый формат представления. В таком случае атрибуты можно смело перенести в состав суперкласса "пользователь". Помимо того, оба производных класса связаны с классом "предложение курса". Как быть с этими связями? Существует две возможности: • оставить связи на уровне подклассов; • переместить связь на уровень суперкласса, снабдив ее "суммарным" признаком Какой из способов верен? Корректны оба. Какой лучше? Это зависит от обстоятельств. Если объект "предложение курса" необходим для получения информации о том, кто из студентов и профессоров связан с определенным курсом, тогда придется кстати второй вариант, предполагающий существование единого множества элементов данных. Если же в тот или иной момент времени требуется получить сведения либо о студентах, либо о профессоре, но не те и другие одновременно, лучшим, вероятно, окажется первый способ. Выбор решения зависит от результатов тщательного изучения вариантов использования системы и их отдельных сценариев.
![]() ![]() Что делать, если нет взаимности? А теперь спустимся с небес на землю. Приземлились? Продолжаем разговор... ![]() Живите по правилу: МАЛО ЛИ ЧТО НА СВЕТЕ СУЩЕСТВУЕТ? Я неслучайно подчеркиваю, что место в голове ограничено, а информации вокруг много, и что ваше право... ![]() Что вызывает тренды на фондовых и товарных рынках Объяснение теории грузового поезда Первые 17 лет моих рыночных исследований сводились к попыткам вычислить, когда этот... ![]() Система охраняемых территорий в США Изучение особо охраняемых природных территорий(ООПТ) США представляет особый интерес по многим причинам... Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:
|