П О Р Т А Л                            
С Е Т Е В Ы Х                          
П Р О Е К Т О В                        
  
Поиск по сайту:
                                                 
Главная

О проекте

Web-мастеру
     HTML & JavaScript
     SSI
     Perl
     PHP
     XML & XSLT
     Unix Shell

MySQL

Безопасность

Хостинг

Другое








Самое читаемое:

Учебник PHP - "Для Чайника".
Просмотров 4064 раз(а).

Иллюстрированный самоучитель по созданию сайтов.
Просмотров 6717 раз(а).

Учебник HTML.
Просмотров 3688 раз(а).

Руководство по PHP5.
Просмотров 5958 раз(а).

Хостинг через призму DNS.
Просмотров 4766 раз(а).

Подборка текстов стандартных документов.
Просмотров 56212 раз(а).

Учебник PHP - Самоучитель
Просмотров 3654 раз(а).

Документация на MySQL (учебник & справочное руководство)
Просмотров 8238 раз(а).

Внешние атаки...
Просмотров 4507 раз(а).

Учебник PHP.
Просмотров 3149 раз(а).

SSI в примерах.
Просмотров 156 раз(а).



 
 
| Добавить в избранное | Сделать стартовой | Помощь





ГЛАВА 6. Объектно-ориентированные возможности РНР

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

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

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

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

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

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

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

Рис. 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, не влияя на функциональность других классов. Таким образом, модульность кода и гибкость относятся к числу основных преимуществ ООП.

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

Назад | Содержание раздела | Общее Содержание | Вперед



Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
 





Copyright © 2005-2016 Project.Net.Ru