Организация наследования в диаграмме классов (Лабораторная работа № 2)

Страницы работы

Содержание работы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Похожие материалы

Информация о работе