Главная » Java, Структуры данных и алгоритмы » Наследование классов

0

Во избежание избыточного повторения кода модульная и иерархическая структура объектно-ориентированного программирования позволяет осуществлять использование имеющегося кода благодаря технологии наследования. Эта технология предполагает создание общих классов, которые затем разделяются на частные, причем в этих частных классах автоматически повторяется код общего класса. Нацример, класс Number содержит классы Float, Integer и Long. В универсальном классе, называемом также базовый класс, или суперкласс, описываются «общие» переменные экземпляра класса, а также методы, применимые в самых различных ситуациях. Далее в классах, которые уточняют, расширяют или наследуют общий класс, повторно не указывается реализация общих методов, так как они автоматически наследуются из суперкласса. В конкретных классах описываются методы, характерные только для этого подкласса (который называют также производный класс).

Для наглядности этой концепции рассмотрим следующий пример.

Пример 2.1. Пусть в классе S описаны объекты, содержащие поле х, а также методы а(), h() и с() (конкретный тип поля и назначение* методов а(), Ь() и с() не существенны). Предположим, необходимо описать

класс Г, который расширяет S, а также содержит дополнительное поле у и еще два метода d() и е(). Это подразумевает, что класс Г содержит два поля, х и у, и пять методов — я(), с(), d() и е(). То естй класс Тнаследует переменную экземпляра х и методы я(), />() и с() из класса S. Отношения между классами Ти 5 представлены в схеме наследования классов на рис. 2.4. В каждом блоке схемы представлен отдельный класс, а в отдельных ячейках блоков указаны имя класса, поля (или переменные экземпляра) и методы. Стрелка от блока Тк блоку S обозначает, что класс Т расширяет (или наследует) класс S.

Рис. 2.4. Схема наследования классов Каждый блок обозначает класс, в котором указаны его имя, поля и методы. Некоторые из этих элементов могут опускаться, если они не содержат существенных деталей. Отношения наследования показаны направлением стрелки между блоками

Создание объекта и ссылка

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

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

Динамическая компоновка

Метод объекта о вызывается из другой программы отправкой сообщения, обычно записываемого с помощью оператора «точка» (п 13 2) «о.а()». В скомпилированной версии программы при обработке участка кода, соответствующего этому обращению, исполняющая среда просматривает класс Г, которому принадлежит объект о, и выполняет его, предварительно проверяя, поддерживает ли класс Г метод а() Таким образом, среда исполнения проверяет, описан ли метод а() в самом классе Т Если описан, то метод выполняется. Если нет, система обращается к суперклассу S класса Т. Если метод а() описан в классе S, то метод выполняется Если же метод не описан и в классе S, то происходит обращение к суперклассу класса S. Поиск метода а() осуществляется последовательно во всей иерархии классов до тех пор, пока метод а() не будет найден и затем выполнен или не будет достигнут класс на самой вершине иерархии классов (например, в Java это класс Object). Если метод а() не найден, выдается сообщение об ошибке. Алгоритм, обрабатывающий сообщение о а() и осуществляющий поиск определенного метода, называется алгоритмом динамической компоновки (или динамического связывания). Динамическая компоновка, используемая для поиска метода а() при обработке сообщения о.а(), является эффективным механизмом повторного использования программных элементов. Динамическая компоновка лежит в основе еще одного полезного свойства объектно-ориентированного программирования — полиморфизма.

Источник: Гудрич М.Т. Г93 Структуры данных и алгоритмы в Java / М.Т. Гудрич, Р. Тамассия; Пер. с англ. A.M. Чернухо. — Мн.: Новое знание, 2003. — 671 е.: ил.

По теме:

  • Комментарии