САМОУЧИТЕЛЬ PHP 4



         

Полиморфизм


Полиморфизм

(многоформенность)— это, я бы сказал, одно из интересных следствий идеи наследования. В общих словах, полиморфность

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

Вернемся к нашему предыдущему примеру с классами A и B.

class A {

 // Выводит, функция какого класса была вызвана

 function Test() { echo "Test from A\n"; }

 // Тестовая функция — просто переадресует на Test()

 function Call() { Test(); }

}

class B extends A {

 // Функция Test() для класса B

 function Test() { echo "Test from B\n"; }

}

$a=new A();

$b=new B();

Давайте рассмотрим следующие команды:

$a->Call(); // напечатается "Test from A"

$b->Test(); // напечатается "Test from B"

$b->Call(); // Внимание! Напечатается "Test from B"!

Обратите внимание на последнюю строчку: вопреки ожиданиям, вызывается не функция Test() из класса A, а функция из класса B! Складывается впечатление, что Test() из B просто переопределила

функцию Test() из A. Так оно на самом деле и есть. Функция, переопределяемая в производном классе, называется виртуальной.

Механизм виртуальных функций позволяет нам, например, "подсовывать" функциям, ожидающим объект одного класса, объект другого, производного, класса. Еще один классический пример — класс, воплощающий собой свойства геометрической фигуры, и несколько производных от него классов — квадрат, круг, треугольник и т. д. Базовый класс имеет виртуальную функцию Draw(), которая заставляет объект нарисовать самого себя. Все производные классы-фигуры, разумеется, переопределяют эту функцию (ведь каждую фигуру нужно рисовать по-особому). Также у нас есть массив фигур, причем мы не знаем, каких именно. Зато, используя полиморфизм, мы можем, не задумываясь, перебрать все элементы массива и вызвать для каждого из них метод Draw() — фигура сама




Содержание  Назад  Вперед