Наследование является одним из важнейших элементов объектно-ориентированного подхода, позволяющим описывать предметную область проекта с помощью иерархии классов. В такой иерархии классы связаны отношениями наследования, определяющие связи между общими и конкретными классами. В качестве примера отношения наследования можно привести связь между общим классом «Печатная продукция» и конкретными классами «Книга», «Журнал» и «Газета».
Наиболее часто наследование используется для связывания классов между собой отношением обобщения и выделения интерфейсов, определяющих обязательный набор операций класса, наследуемых от интерфейса. Поэтому важно рассмотреть наследование от классов и от интерфейсов.
Класс позволяет объединить в одном контейнере атрибуты, уникально идентифицирующие конкретный экземпляр класса, а также действия (операции), выполняющиеся с этими атрибутами. При установлении наследования между классами выделяют класс, от которого производится наследование, как класс-предок и класс, наследующийся от класса-предка. Такой класс принято называть классом-наследником.
Класс-наследник полностью принимает от класса-предка все его элементы, включая атрибуты и операции, если эти элементы не запрещены для наследования. Для ограничения наследования элементов классов используются модификаторы доступа, задаваемые в поле «Видимость» элементов класса. В качестве возможных вариантов доступа могут быть использованы следующие модификаторы: public, private и protected. Применение модификатора доступа public означает, что данный элемент класса может быть использован любыми другими классами без ограничений. Модификатор доступа private обозначает элементы класса, не доступен для других классов, включая классы-наследники данного класса. Модификатор доступа protected обозначает элементы класса, доступные для использования только классами-наследниками данного класса.
Многие объектно-ориентированные языки программирования, например, C++, позволяют организовать наследование одного класса-наследника одновременно от двух и более классов-предков. Однако такое наследование значительно затрудняет понимание работы программы и обычно не используется или даже отключается в настройках компилятора. Кроме того, многие языки программирования, разработанные после выхода C++, не поддерживают множественное наследование на уровне классов.
С наследованием связана возможность приведения объектов класса-потомка к типу класса-предка. Такая возможность вызвана тем, что класс-наследник полностью наследует всё содержимое класса-предка за исключением элементов, запрещённых для наследования.
Интерфейсы похожи на классы, однако в отличие от классов не содержат атрибутов. Кроме того, все операции интерфейсов имеют единственный модификатор доступа – public. При программном формировании интерфейсов их операции не наполняют содержимым, т.е. конкретным программным кодом, а оставляют в виде деклараций. Кроме того, интерфейсы, в отличии от классов не могут иметь реализации в виде объектов. Такие ограничения возможностей интерфейсов вызваны их основным и исходным назначением – определять программный интерфейс взаимодействия с одним или множеством классов, наследуемых от данного интерфейса.
При наследовании от интерфейса класс-наследник обязательно должен наполнить программным кодом (реализовать) все операции наследуемого интерфейса. Поэтому для классов-наследников интерфейсов применяют термин «реализация», означающий, что класс реализует все методы (операции) интерфейса.
Для интерфейсов, в отличие от классов не установлено ограничение на количество наследуемых классов. Иными словами, класс может быть унаследован от теоретически неограниченного количества интерфейсов. При этом допустимо одновременное наследование одним классом и интерфейсов и других классов.
Для интерфейсов, как и для классов, характерна возможность приведения объектов к типу интерфейса, от которого унаследован класс объекта.
Абстрактные классы используются для организации разветвлённых иерархий классов. При этом в отличие от обычных классов, абстрактные классы не соответствуют ни одному реальному объекту в предметной области проекта, что не позволяет создавать экземпляры (объекты) абстрактных классов.
Абстрактные классы в этом похожи на интерфейсы, но, в то же время могут содержать как операции, так и атрибуты, а также использовать любые модификаторы доступа операций и атрибутов. Кроме того, при реализации абстрактных классов в программном коде операции классов могут быть как реализованными, так и только задекларированными (абстрактными). Абстрактные методы обязательно должны быть реализованы в классах-наследниках абстрактного класса.
Для того чтобы указать, что данный класс является абстрактным, следует выбрать флажок «Is Abstract» в свойствах фигуры класса.
Листовые классы являются противоположностью абстрактным классам. Данные классы, как и обычные классы, предназначены для представления объектов предметной области, что позволяет создавать их экземпляры. Однако листовые классы нельзя использовать в качестве классов-предков. Иными словами, листовые классы не могут иметь потомков.
Для того чтобы указать, что данный класс является листовым, следует выбрать флажок «Is Leaf» в свойствах фигуры класса.
Виртуальные операции используются для обозначения возможности их переопределения в классах-потомках. Безусловно, для выполнения переопределения операций в классах потомках нет необходимости использования виртуальных операций. Однако при переопределении не виртуальных операций создаваемые операции в классах-потомках никак не связаны с операциями классов-предков. Именно использование виртуальных операций позволяет связать операции в классе-предке и соответствующие им операции в классе-потомке.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.