- иерархическое наследование

Печать: Шрифт: Абв Абв Абв
admin 28 Февраля 2006 в 16:53:29
Простое и иерархическое наследование

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

Наследование является исключительно полезным средством программирования, поскольку его применение предотвращает копирование кода, совместно используемого структурами данных, — например, общих характеристик различных типов транспортных средств, упоминавшихся в предыдущем абзаце. В общем случае синтаксис наследования характеристик другого класса в РНР выглядит так:

class Class_name2 extends Class_name1 {
объявления атрибутов;
объявления методов;
}


Ключевое слово extends говорит о том, что класс Class_name2 наследует все характеристики класса Class_name1.

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

модификации программы. Например, в иерархии, изображенной на рис. 6.1, изменения в классе «автомобиль» никак не отразятся на коде (и данных) класса «самолет», и наоборот.

Вызов конструктора производного класса не приводит к автоматическому вызову конструктора базового класса.
[div align=center][/div]
Рис. 6.1. Иерархия транспортных средств

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

Листинг 6.3. Представление различных типов транспортных средств при помощи наследования

<?
// Транспортное средство
class Vehicle {
var
$model;
var
$current_speed;
function
setSpeed($mph) {
$this->current_speed = $mph;
}
function
getSpeed() {
return
$this->current_speed;
}
}
// Автомобиль
class Auto extends Vehicle {
var
$fue1_type;
function
setFuelType($fuel) {
$this->fuel_type = $fuel;
}
function
getFuelType() {
return
$this->fuel_type;
}
}
// Самолет
class Airplane extends Vehicle {
var
$wingspan;
function
setWingSpan($wingspan) {
$this->wingspan = $wingspan;
}
function
getWingSpan() {
return
$this->wingspan;
}
}
?>


Объекты этих классов создаются следующим образом:

<?
$tractor
= new Vehicle;
$gulfstream = new Airplane;
?>


Приведенные команды создают два объекта. Первый объект, $tractor, относится к классу Vehicle. Второй объект, $gulfstream, относится к классу Airplane и потому обладает как общими характеристиками класса Vehicle, так и уточненными характеристиками класса Airplаne.

Ситуация, при которой класс наследует свойства нескольких родительских классов, называется множественным наследованием. К сожалению, в РНР множественное наследование не поддерживается. Например, следующая конструкция невозможна в РНР:

class Airplane extends Vehicle extends Building...

Многоуровневое наследование

С увеличением размеров и сложности программ может возникнуть необходимость в многоуровневом наследовании. Иначе говоря, класс будет наследовать свои свойства от других классов, которые, в свою очередь, будут наследовать от третьих классов и т. д. Многоуровневое наследование развивает модульную структуру программы, обеспечивая простоту сопровождения и более четкую логическую структуру. Скажем, при использовании примера с транспортными средствами в большой программе может появиться необходимость в дополнительном разбиении на субклассы суперкласса Vehicle, продолжающем логическое развитие иерархии. Например, транспортные средства можно дополнительно разделить на наземные, морские и воздушные, чтобы суперкласс специализированных субклассов выбирался в зависимости от среды, в которой перемещается данное транспортное средство. Новый вариант иерархии показан на рис. 6.2.

Краткий пример, приведенный в листинге 6.4, подчеркивает некоторые важные аспекты многоуровневого наследования в РНР.

Листинг 6.4. Многоуровневое наследование

<?
class Vehicle {
Объявления атрибутов...
Объявления методов...
}
class
Land extends Vehicle {
Объявления атрибутов...
Объявления методов...
}
class
Саr extends Land {
Объявления атрибутов...
Объявления методов...
}
$nissan = new Car;
?>


Объект $nissan содержит все атрибуты и методы классов Саr, Land и Vehicle. Как видите, программа получается исключительно модульной. Допустим, когда-то в будущем вы захотите добавить в класс Land новый атрибут. Нет проблем: внесите соответствующие изменения в класс Land, и этот атрибут немедленно становится доступным для классов Land и Саr, не влияя на функциональность других классов. Таким образом, модульность кода и гибкость относятся к числу основных преимуществ ООП.
[div align=center][/div]
Рис. 6.2. Многоуровневое наследование в иерархии Vehicle

Хотя масс наследует свои характеристики от цепочки родителей, конструкторы родительских классов не вызываются автоматически при создании объектов класса-наследника. Эти конструкторы могут вызываться классом-наследником в виде методов.
Добавить сообщение
Чтобы добавлять комментарии зарeгиcтрирyйтeсь