Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
49
Добавлен:
12.05.2015
Размер:
1.82 Mб
Скачать

Глава 2. Обзор языка Java

33

Рис. 2.1. Инкапсуляция: public-методы можно использовать для защиты private-данных

Наследование

Наследование есть процесс, с помощью которого один объект приобретает свойства другого объекта. Оно важно потому, что поддерживает концепцию иерархической классификации. Как уже говорилось выше, наибольшая часть знаний становится управляемой только с помощью иерархических (т. е. ор­ганизованных "сверху вниз") классификаций. Например, порода поисковых охотничьих собак Golden Retriever является частью классификации dog (собаки), которая, в свою очередь, есть часть класса Memmal (млекопитаю­щие) — подкласса большого класса Animal (животные). Без применения классификаций каждый объект нуждался бы в явном определении всех своих характеристик. При использовании наследования объект нуждается в опре­делении только тех качеств, которые делают его уникальным в собственном классе. Он может наследовать общие свойства от своего родителя. Поэтому именно механизм наследования дает возможность одному объекту быть спе­цифическим экземпляром более общего случая. Рассмотрим этот процесс поподробнее.

Большинство людей, естественно, видит мир, состоящим из объектов, кото­рые связаны друг с другом иерархическим способом, например, из животных, млекопитающих и собак. Если бы вы хотели описать животных абстрактным образом, вам следовало бы определить их некоторые атрибуты, например размер, интеллект и тип скелетной системы. Животные также обладают не­которыми поведенческими аспектами — они едят, дышат и спят. Такое опи­сание атрибутов и поведения и определяет класс для животных.

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

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

34 Часть I. Язык Java

С Животные ,

Рис. 2.2. Схема иерархии классов

Наследование взаимодействует также и с инкапсуляцией. Если данный класс инкапсулирует некоторые атрибуты, то любой подкласс будет иметь те же атрибуты плюс атрибут, который он добавляет как часть своей специали­зации (рис. 2.3). Это ключевая концепция, которая позволяет объектно-ориентированным программам расти по сложности линейно, а не геомет­рически. Новый подкласс наследует все атрибуты всех его предков. Он не имеет непредсказуемых взаимодействий с большинством остальных кодов в системе.

Полиморфизм

Полиморфизм (от греч. — "имеющий много форм") — свойство, которое по­зволяет использовать один интерфейс для общего класса действий. Специ­фическое действие определяется точной природой ситуации. Рассмотрим стек (список типа LIFO — Last-In, First-Out). Вы можете иметь программу, которая требует три типа стеков. Один стек используется для целых значе­ний, другой — для значений с плавающей точкой, и третий — для символов. Алгоритм, который реализует каждый стек — один и тот же, хотя хранимые данные различны. В не объектно-ориентированном языке от вас бы потре­бовалось создать три различных набора стековых подпрограмм, каждый из которых имел бы собственное имя. Вследствие полиморфизма в языке Java можно специфицировать общий для всех типов данных набор стековых подпрограмм, использующих одно и то же имя.

ЛАБРАДОР

Возраст Период беременности Дрессируемый?

Пол Охотничий инстинкт Дрессирован на утиную охоту?

Вес Длина хвоста? Сертифицирован АКС?

Размер помета Комнатный/Дворовый?

Рис. 2.3. Лабрадор наследует свойства всех своих суперклассов

В общем смысле, концепцию полиморфизма часто выражают фразой "один интерфейс, много методов". Это означает, что возможно спроектировать ро­довой интерфейс для группы связанных объектов. Это позволяет уменьшить сложность, допуская использование одного и того же интерфейса для общего класса действий. Забота компилятора —' выбрать специфическое действие (т. е. метод) для его использования в каждой конкретной ситуации. Вы — программист — не должны делать этот выбор "вручную". Вам нужно только помнить и использовать общий интерфейс.

36 Часть I. Язык Java

Расширяя аналогию с собакой, можно сказать, что обоняние у собаки по­лиморфно. Если она чует кошку, то лает и бежит за ней. Если чует пищу, выделяет слюну и бежит к миске. В обеих ситуациях одно и то же чувство — обоняние. Разница в том, что именно она нюхает, т. е. в типе данных, с ко­торым оперирует нос собаки! Та же общая концепция реализована и в языке Java относительно методов в Java-программах.

Полиморфизм, инкапсуляция и наследование работают вместе

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

Из двух примеров реальных объектов, приведенных выше, автомобиль пол­нее иллюстрирует мощь объектно-ориентированного проектирования. При­мер с собаками удобно использовать при обдумывании наследования, а пример с автомобилями больше подходит для программирования. При вож­дении разных типов (подклассов) транспортных средств все водители пола­гаются на наследование. Независимо от того, является ли транспортное средство школьным автобусом, Mercedes-седаном, Porsche или представите­лем семейства minivan (крытый фургон), водитель везде может работать с рулем, колесами, тормозами и акселератором. Наслушавшись скрежетаний в коробке передач, большинство людей может даже справиться с различием между рычажным и автоматическим переключением скоростей, потому что они ясно представляют их общий суперкласс — трансмиссию.

Люди постоянно взаимодействуют с инкапсулированными свойствами авто­мобиля. Педали тормоза и газа скрывают невероятный набор сложностей с настолько простым интерфейсом, что вы можете работать с ним с помощью ног. Работа двигателя, тип тормозов, размер колес не влияют на то, как вы взаимодействуете с определением класса педалей.

Последний атрибут — полиморфизм — ясно отражен в способности произ­водителей автомобилей предлагать широкий набор возможностей для при­мерно одинаковых транспортных средств. Например, вы можете получить противоблокировочную тормозную систему или традиционные тормоза, ру­левое управление с усилителем или реечное управление, 4-, 6- или 8-ци­линдровый двигатель. В любом случае, когда вы не хотите двигаться, то будете нажимать педаль тормоза для остановки, поворачивать руль для из­менения направления и нажимать акселератор. Один и тот же интерфейс можно использовать для управления различными реализациями.

Соседние файлы в папке JavaLit