Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
php / Lab8.doc
Скачиваний:
45
Добавлен:
07.02.2016
Размер:
118.27 Кб
Скачать

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

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

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

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

<?

class Vehicle {

//Объявления атрибутов...

//Объявления методов...

}

class Land extends Vehicle {

//Объявления атрибутов...

//Объявления методов...

}

class Car extends Land {

//Объявления атрибутов...

//Объявления методов...

}

$nissan = new Car;

?>

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

8. Абстрактные классы.

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

В РНР отсутствует прямая поддержка абстрактных классов, однако существует простое обходное решение — достаточно определить в "абстрактном" классе конструктор и включить в него вызов die( ). Вернемся к классам из листинга 4. Скорее всего, вам никогда не придется создавать экземпляры классов Land и Vehicle, поскольку они не могут представлять физические объекты. Для представления реальных объектов (например, автомобилей) следует создать класс, производный от этих классов. Следовательно, чтобы предотвратить возможное создание объектов классов Land и Vehicle, необходимо включить в их конструкторы вызовы die( ), как показано в листинге 5.

Листинг 5. Создание абстрактных классов.

<?

class Vehicle {

//Объявления атрибутов...

function Vehicle() {

die ("Cannot create Abstract Vehicle class!");

}

//Объявления других методов...

}

class Land extends Vehicle {

//Объявления атрибутов...

function Land() {

die ("Cannot create Abstract Land class!");

}

//Объявления других методов.

}

class Car extends Land {

//Объявления атрибутов...

//Объявления методов...

}

?>

Попытка создания экземпляра этих абстрактных классов приведет к выдаче сообщения об ошибке и завершению программы.

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