Рекомендации по программированию. Наследование классов предоставляет программисту богатейшие возможности организации кода и его многократного использования

Наследование классов предоставляет программисту богатейшие возможности организации кода и его многократного использования. Выбор наиболее подходя­щих средств для целей конкретного проекта основывается на знании механизма их работы и взаимодействия.

Наследование класса Y от класса X означает, что Y представляет собой разновид­ность класса X, то есть более конкретную, частную концепцию. Базовый класс X является более общим понятием, чем Y1. Везде, где можно использовать X, мож­но использовать и Y, но не наоборот (вспомните, что на место базового класса можно передавать любой из производных). Необходимо помнить, что во время

1 Например, каждый программист - человек, но не каждый человек - программист.

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

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

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

Обычные (не виртуальные) методы переопределять в производных классах не рекомендуется, поскольку производные классы должны наследовать свойства базовых, а спецификатор new, с помощью которого переопределяется обычный метод, «разрывает» отношение наследования на уровне метода. Иными словами, невиртуальный метод должен быть инвариантен относительно специализации, то есть должен сохранять свойства, унаследованные из базового класса незави­симо от того, как конкретизируется (специализируется) производный класс. Специализация производного класса достигается добавлением новых методов и переопределением существующих виртуальных методов.

Альтернативным наследованию механизмом использования одним классом друго­го является вложение, когда один класс является полем другого. Вложение пред­ставляет отношения классов «Y содержит X» или «Y реализуется посредством X». Для выбора между наследованием и вложением служит ответ на вопрос о том, может ли у Y быть несколько объектов класса X («Y содержит X»). Кроме того, вложение используется вместо наследования тогда, когда про классы X и Y нельзя сказать, что Y является разновидностью X, но при этом Y использует часть функ­циональности X («Y реализуется посредством X»).


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: