Здавалка
Главная | Обратная связь

Наследование атрибутов



Рассмотрим наследование на примере программы для управления

зоомагазином. Одним из предметных классов будет класс Животное для

представления любого животного из тех, которыми торгует магазин. Среди

данных, описывающих объекты класса Животное, будут русское и латинское

названия животного, его возраст и пол. Однако подбор остальных сведений

уже зависит от конкретного вида животного. В описаниях всех животных,

которые продаются в магазине, есть некоторые общие данные, а также

данные, специфичные для конкретных подгрупп(рептилиях - длина, а о млекопитающих – вес, рыбы-цвет).

Эти связи можно представить на диаграмме (см. рис.4.1). Класс

Животное содержит данные, общие для всех видов животных. Подгруппы -

Млекопитающее, Рептилия и Рыба - добавляют к этому классу специфичную

информацию. Повторять в них общие данные необязательно, так как они

наследуются от класса Животное. Другими словами, классы Млекопитающее,

Рептилия и Рыба включают и те четыре атрибута, которые определены в

классе Животное.

Стрелочки направлены на класс так как,В объектно-ориентированной терминологии подгруппы называются подклассами или производными классами. Класс Животное является по

отношению к ним суперклассом, или базовым классом. Для усвоения понятия наследования надо помнить, что подклассы являются специализациями суперкласса. Таким образом, отношение между базовым и Производным классом можно выразить словом «является»:

- млекопитающее является животным;

- рептилия является животным;

- рыба является животным.

Если слово «является» неадекватно описывает ситуацию, то вы имеете дело не с наследованием. Предположим, к примеру, что вы пишете

программу для учета оборудования в пункте проката лыж. Вы создаете класс

для товара общего вида и его подклассы для представления конкретных

типов сдаваемых напрокат товаров, как показано в первых четырех

прямоугольниках на рис. 4.2. Наследование здесь вполне применимо,

поскольку и лыжи, и ботинки, и палки являются частными случаями товара.

Рис.4. 2. Наследование и отсутствие наследования в программе для

пункта проката лыж.

Однако, когда вы переходите к рассмотрению товаров и клиентов,

берущих их в аренду, возникают проблемы. Хотя между арендатором и

товаром существует непосредственная связь, это не наследование: ведь

словом «является» ее не описать. Взятый напрокат товар не является

арендатором!

Ситуация с товарами и сдаваемым напрокат инвентарем сложнее.

Классы Инвентарь, Лыжи, Ботинки и Палки описывают типы товаров, но не

материальные предметы. Например, в пункте проката может быть много пар

однотипных лыж и много пар ботинок одной модели и размера. Поэтому

конкретный сдаваемый напрокат предмет описывается классом Предмет

проката.

Предметом проката могут быть лыжи, ботинки или палки. Это может

быть только один предмет, а не три, как показано на рис 4.2. Поэтому

предмет проката – это не пара лыж, не пара ботинок, и не пара палок.

(Кстати, проблема еще и в том, что нет класса, который содержал бы

информацию о размере и/или длине предмета.)

Одно из возможных решений состоит в том, чтобы создать отдельный

класс предмета проката для каждого типа товара, как показано на рис. 4.3.

Обратите внимание на направление стрелок. Физическое расположение

элементов на диаграмме не соответствует направлению наследования.

Помните, что по соглашению стрелки направлены от производного класса к

базовому.

Класс Пара лыж наследует информацию о типе предмета от класса

Лыжи. Он также получает данные о сдаваемом напрокат предмете от класса

Предмет проката. Объект класса Пара лыж отражает пару лыж, а также

сдаваемый напрокат предмет.

В таком виде структура классов проходит тест на соответствие

отношению «является» и, стало быть, удовлетворяет условиям правильного

наследования. (Необходимо отметить, что попутно вы получили класс,

содержащий такую информацию, как длина и размер инвентаря.) Класс

Арендатор вообще не принимает участия в иерархии наследования.

В таком виде структура классов проходит тест на соответствие

отношению «является» и, стало быть, удовлетворяет условиям правильного

наследования. (Необходимо отметить, что попутно вы получили класс,

содержащий такую информацию, как длина и размер инвентаря.) Класс

Арендатор вообще не принимает участия в иерархии наследования.

Множественное наследование

Когда некий класс наследует информацию более чем одного базового

класса, следует говорить о множественном наследовании. Различные языки

программирования и СУБД поддерживают множественное наследование в

разной степени.

Не каждый класс в иерархии наследования непременно используется

для создания объектов. Например, маловероятно, что будут создаваться

объекты класса Инвентарь или Предмет проката (см. рис. 4.3). Эти классы

присутствуют только для того, чтобы предоставить общий набор атрибутов и

методов своим производным классам. Такого рода классы называются

абстрактными или виртуальными. Напротив, классы, из которых создаются

объекты, называются конкретными.

Интерфейсы

Некоторые объектно-ориентированные языки (прежде всего Java) не

поддерживают множественного наследования. Они допускают наличие

только одного базового класса, но зато разрешают реализовывать разные

интерфейсы.

Интерфейс (Interface) - это спецификация класса, методы которого не

хранят никакого кода. Другими словами, в классе определены сигнатуры

всех методов, но нет их реализации. Предоставить осуществление каждого

метода входит в обязанности класса, реализующего интерфейс. Последний

может содержать методы и атрибуты или только методы или только атрибуты.

В большинстве случае интерфейс проектируется для того, чтобы

придать классу дополнительную функциональность. Например, если бы

иерархию, изображенную на рис. 4.3, нужно было использовать в среде, не

поддерживающей множественное наследование, то класс Пара ботинок мог

бы наследовать классу Ботинки и реализовывать интерфейс Предмет

проката. В последнем были бы атрибуты, описывающие прокат инвентаря, а

также методы, необходимые для выдачи, вычисления арендной платы и

времени возврата арендованного инвентаря. Любой класс, представляющий

инвентарь, должен был бы реализовать этот интерфейс, описав тем самым

поведение, которым должен обладать сдаваемый напрокат объект.

Полиморфизм

В общем случае методы наследуются подклассами от своих

суперклассов. Подкласс может применять методы базового класса как свои

собственные. Однако иногда невозможно написать метод, достаточно общий

для использования всеми подклассами. Предположим, например, что класс

Инвентарь из предыдущего примера имеет метод printCatalogEntry.

предназначенный для красивой печати каталожного описания одного вида

товаров. Но одни подклассы класса Инвентарь имеют атрибуты,

отсутствующие в других подклассах, поэтому метод printCatalogEntry по-

разному реализуется в каждом подклассе.

Для решения этой проблемы можно воспользоваться преимуществами,

которые дает полиморфизм (Polymorphism), а именно возможностью иметь

разные тела у методов с одним и тем же именем, но принадлежащих

различным классам в одной иерархии наследования. Класс Инвентарь

включает в себя прототип метода printCatalogEntry, который лишь описывает

его открытый интерфейс. В этом классе у метода нет тела, то есть не

сказано, какие конкретные действия он должен выполнить (такой метод

называется абстрактным). В каждом подклассе он переопределяется -

пишется необходимый код.

Удобство полиморфизма в том, что программист может ожидать наличия

методов с одним и тем же именем и семантикой выполняемой процедуры во

всех подклассах одного и того же базового класса. Но при этом каждый

подкласс может выполнять операцию так, как ему нужно. Инкапсуляция

скрывает детали реализации от всех объектов вне данной иерархии.

Очень легко спутать полиморфизм с перегрузкой. Надо помнить, что

перегрузка относится к методам одного и того же класса, имеющим одно имя,

но разные сигнатуры, тогда как полиморфизм применим к разным подклассам

одного базового класса, в которых есть методы с одинаковой сигнатурой, но

разной реализацией.

 







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.