Работа 2. организация наследования в диаграмме классов

Наследование является одним из важнейших элементов объектно-ориентированного подхода, позволяющим описывать предметную область проекта с помощью иерархии классов [1, 4]. В такой иерархии классы связаны отношениями наследования, определяющие связи между общими и конкретными классами. В качестве примера отношения наследования можно привести связь между общим классом «Печатная продукция» и конкретными классами «Книга», «Журнал» и «Газета».

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

Наследование от класса

Класс позволяет объединить в одном контейнере атрибуты, уникально идентифицирующие конкретный экземпляр класса, а также действия (операции), выполняющиеся с этими атрибутами. При установлении наследования между классами выделяют класс, от которого производится наследование, как класс-предок и класс, наследующийся от класса-предка. Такой класс принято называть классом-наследником.

Класс-наследник полностью принимает от класса-предка все его элементы, включая атрибуты и операции, если эти элементы не запрещены для наследования. Для ограничения наследования элементов классов используются модификаторы доступа, задаваемые в поле «Видимость» элементов класса. В качестве возможных вариантов доступа могут быть использованы следующие модификаторы: public, private и protected. Применение модификатора доступа public означает, что данный элемент класса может быть использован любыми другими классами без ограничений. Модификатор доступа private обозначает элементы класса, не доступен для других классов, включая классы-наследники данного класса. Модификатор доступа protected обозначает элементы класса, доступные для использования только классами-наследниками данного класса.

Многие объектно-ориентированные языки программирования, например, C++, позволяют организовать наследование одного класса-наследника одновременно от двух и более классов-предков. Однако такое наследование значительно затрудняет понимание работы программы и обычно не используется или даже отключается в настройках компилятора. Кроме того, многие языки программирования, разработанные после выхода C++, не поддерживают множественное наследование на уровне классов.

С наследованием связана возможность приведения объектов класса-потомка к типу класса-предка. Такая возможность вызвана тем, что класс-наследник полностью наследует всё содержимое класса-предка за исключением элементов, запрещённых для наследования.

Наследование от интерфейсов

Интерфейсы похожи на классы, однако в отличие от классов не содержат атрибутов. Кроме того, все операции интерфейсов имеют единственный модификатор доступа – public. При программном формировании интерфейсов их операции не наполняют содержимым, т.е. конкретным программным кодом, а оставляют в виде деклараций. Кроме того, интерфейсы, в отличии от классов не могут иметь реализации в виде объектов. Такие ограничения возможностей интерфейсов вызваны их основным и исходным назначением – определять программный интерфейс взаимодействия с одним или множеством классов, наследуемых от данного интерфейса.

При наследовании от интерфейса класс-наследник обязательно должен наполнить программным кодом (реализовать) все операции наследуемого интерфейса. Поэтому для классов-наследников интерфейсов применяют термин «реализация», означающий, что класс реализует все методы (операции) интерфейса.

Для интерфейсов, в отличие от классов не установлено ограничение на количество наследуемых классов. Иными словами, класс может быть унаследован от теоретически неограниченного количества интерфейсов. При этом допустимо одновременное наследование одним классом и интерфейсов и других классов.

Для интерфейсов, как и для классов, характерна возможность приведения объектов к типу интерфейса, от которого унаследован класс объекта.

Абстрактные классы

Абстрактные классы используются для организации разветвлённых иерархий классов. При этом в отличие от обычных классов, абстрактные классы не соответствуют ни одному реальному объекту в предметной области проекта, что не позволяет создавать экземпляры (объекты) абстрактных классов.

Абстрактные классы в этом похожи на интерфейсы, но, в то же время могут содержать как операции, так и атрибуты, а также использовать любые модификаторы доступа операций и атрибутов. Кроме того, при реализации абстрактных классов в программном коде операции классов могут быть как реализованными, так и только задекларированными (абстрактными). Абстрактные методы обязательно должны быть реализованы в классах-наследниках абстрактного класса.

Для того чтобы указать, что данный класс является абстрактным, следует выбрать флажок «Is Abstract» в свойствах фигуры класса.

Листовые классы

Листовые классы являются противоположностью абстрактным классам. Данные классы, как и обычные классы, предназначены для представления объектов предметной области, что позволяет создавать их экземпляры. Однако листовые классы нельзя использовать в качестве классов-предков. Иными словами, листовые классы не могут иметь потомков.

Для того чтобы указать, что данный класс является листовым, следует выбрать флажок «Is Leaf» в свойствах фигуры класса.

Виртуальные операции

Виртуальные операции используются для обозначения возможности их переопределения в классах-потомках. Безусловно, для выполнения переопределения операций в классах потомках нет необходимости использования виртуальных операций. Однако при переопределении не виртуальных операций создаваемые операции в классах-потомках никак не связаны с операциями классов-предков. Именно использование виртуальных операций позволяет связать операции в классе-предке и соответствующие им операции в классе-потомке.

Такая связь носит название полиморфизм и тесно связана с наследованием и приведением типа объекта класса-наследника к типу класса-предка. При различном переопределении виртуальных операций в классах-потомках допустимо создать экземпляры таких классов-наследников (объектов). Такие объекты могут быть приведены к типу класса-предка и присвоены переменным этого класса. Однако при вызове метода, которому соответствует виртуальная операция, по разному переопределённая в разных классах-наследниках, реально будет вызван не метод класса-предка, а разные методы классов-потомков.

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

Используемые фигуры

Работа 2. организация наследования в диаграмме классов Фигура «Обобщение» устанавливает связь между более общим элементом (предком) и более специфичным или частным элементом (потомком или наследником). Другим названием отношения обобщения является наследование. В качестве элементов, к которым применимо отношение обобщения могут выступать классы, пакеты, интерфейсы и другие элементы языка UML. При наследовании элемент-потомок получает всё содержимое элемента-предка, за исключением содержимого, явно обозначенного, как ненаследуемое.

В случае наследования классов потомок получает от класса-предка все атрибуты и операции, имеющие область видимости (модификатор доступа) public или protected. При этом класс-потомок может расширить возможности класса-предка за счёт использования дополнительных атрибутов и операций.

Отношение обобщения обозначается сплошной линией с треугольной стрелкой на одном конце. Такая стрелка указывает на элемент-предок.

Работа 2. организация наследования в диаграмме классов Работа 2. организация наследования в диаграмме классов Фигура «Интерфейс» устанавливает видимые извне обязательные операции класса, компонента, пакета или другого элемента без определения внутренней структуры этих операций.

Интерфейс, подобно классу, содержит операции, но не содержит атрибутов, состояний или ассоциаций. Существует два способа условного обозначения интерфейса:

Работа 2. организация наследования в диаграмме классов В виде фигуры класса со стереотипом , соединенной с элементом, который его поддерживает с помощью отношения реализации.

Работа 2. организация наследования в диаграмме классов В виде круга, соединенного сплошной линией с элементом, который его поддерживает.

Отношение реализации подразумевает, что клиент, находящийся у хвоста стрелки, поддерживает или наследует все операции, определенные в поставщике, на который указывает наконечник.

Отношение реализации используется между классом (как потребителем) и его интерфейсом (если интерфейс представлен фигурой Класс со стереотипом ) или между реализующим классом (как потребителем) и типом.

Среда Visio предоставляет возможности по управлению тем, в виде каких фигур отображается интерфейс. Для изменения внешнего представления интерфейса щелкните правой кнопкой мыши фигуру Интерфейс, выберите команду Параметры отображения фигуры и установите флажок «Показывать как интерфейс с описанием классов» или «Показывать как интерфейс без описания операций».

Для присвоения имени фигуре «Интерфейс» и добавление значений других свойств используйте диалоговое окно «Свойства UML элемента», для вызова которого дважды щелкните значок элемента в представлении в проводнике по моделям или фигуру элемента в схеме.

Задание

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

2. Наследование от интерфейса. Выделите одну или несколько операций, одинаковых для части классов-наследников, связанных отношением обобщения с классом-предком, созданным в предыдущем задании, и удалите эти операции. Добавьте на диаграмму интерфейс, содержащий удалённые операции. Добавьте наследование от созданного интерфейса к классам, в которых были удалены операции. При этом удалённые операции должны появиться внутри классов вновь.

3. Использование полиморфизма. Выделите одну или несколько одинаковых операций, наследуемых классами от базового класса или от интерфейса, но выполняемых каждым классом по-разному. Обозначьте эти операции, как полиморфные и укажите их явное переопределение внутри классов-потомков. Добавьте в отчёт примечание, содержащее информацию о полиморфических операциях, использованных на диаграмме и причины реализации таких операций, как полиморфических.

4. Использование абстрактных классов. Действуя аналогично заданию 1 данной работы, выделите один или несколько классов-предков, которым не соответствует ни один объект из предметной области. Добавьте между этими классами и их классами-потомками отношения обобщения. Обозначьте добавленные классы, как абстрактные.

Варианты заданий

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

Вопросы для самопроверки

1. Что такое интерфейс и чем он отличается от класса?

2. Какими возможностями и ограничениями обладают абстрактные классы?

3. Назовите самый сильный вид полиморфизма.

4. Чем абстрактный класс отличается от интерфейса?

5. Работа 3. Разработка
диаграммы прецедентов

Диаграммы классов позволяют представлять внутреннее устройство модели предметной области проекта разрабатываемой системы [3]. Однако для построения необходимо общее понимание возможных действий, выполняемых системой, также необходимо понимание того, какие исполнители и внешние системы взаимодействуют разрабатываемой системой. Кроме того, для выполнения грамотного моделирования предметной области проекта важно определить границы системы и действия, попадающие в эти границы.

Лекция 3: Диаграмма классов


Похожие статьи.

Понравилась статья? Поделиться с друзьями: