|
|
|
| Скажите в двух словах, какой главный смысл полиморфизма(читал что 1 интерфейс и множество реализаций), и приведенный код нже демонстрирует ли полиморфизм?
<?php header('content-type: text/html;charset=utf-8'); ?>
<?
// Класс Фигуры (какой фигуры - неизвестно. просто фигуры)
abstract class Figure {
abstract public function Draw(); // абстрактный метод «Нарисовать фигуру»
}
// Класс Треугольника
class Triangle extends Figure {
public function Draw() { // метод «Нарисовать треугольник»
echo 'рисуем треугольник '.'<br/>';
}
}
// Класс Эллипса
class Ellipse extends Figure {
public function Draw() { // метод «Нарисовать эллипс»
echo 'рисуем эллипс '.'<br/>';
}
}
// Класс Круга
class Circle {
public function Draw() { // метод «Нарисовать круг»
echo 'рисуем круг '.'<br/>';
}
}
// Класс Прямоугольника
class Rectangle extends Figure {
public function Draw() { // метод «Нарисовать прямоугольник»
echo 'рисуем прямоугольник '.'<br/>';
}
}
// обыкновенная функция рисования фигуры
function drawFigure($fig) {
if ($fig instanceof Figure) {
$fig->Draw(); // тут мы на этапе написания этой функции не знаем,
// какая именно фигура будет рисоваться, а интерпретатор
// php это знает только на этапе выполнения скрипта
} else {
echo 'Неизвестная фигура';
}
}
// создадим фигуры
$triangle = new Triangle(); // треугольник
$ellipse = new Ellipse(); // эллипс
$rectangle = new Rectangle(); // прямоугольник
$circle = new Circle(); // круг
// нарисуем прямоугольник
drawFigure($rectangle);
// нарисуем эллипс
drawFigure($ellipse);
// попытаемся нарисовать круг
drawFigure($circle);
?>
|
НЕ понятно вот это место:
//Скажите $fig в этот параметр передаются объекты в качестве параметра
//и вот эта переменная $fig превращается в объект?
function drawFigure($fig) {
if ($fig instanceof Figure) { //А здесь сравнивается является ли объект под названием $fig
//объектом класса под названием Figure?
$fig->Draw();
} else {
echo 'Неизвестная фигура';
}
}
|
| |
|
|
|
|
|
|
|
для: Golovastik
(07.12.2010 в 14:45)
| | Смысл полиморфизма.
В базовом классе существует некий виртуальный метод, который можно "переопределить" в производном классе.
Метод базового класса как бы перезаписывается методом производного класса.
Чаще всего это происходит, когда базовый класс - абстрактный и в нем есть абстрактный метод,
который ожидает своей реализации в производных классах, иначе смысла его использования нет.
Я бы назвала все это "Схема(или описание) - конкретная реализация схемы".
У вас схема - класс фигуры, конкретно схему реализуют производные от этого классы.
>НЕ понятно вот это место:
У вас есть функция drawFigure, у которой один входной параметр - $fig. У вас сейчас написано так, что функции все равно,
какой у нее будет входной парамер - просто переменная или объект. Но дальше стоит "шлагбаум" - условие, которое проверяет параметр $fig - этот параметр
должен быть объектом типа Figure, т.е. объект обязательно должен быть наследником класса Figure.
Вы в функцию запихиваете только объекты, поэтому я бы сразу же в параметре функции и указывала, что мне нужны только объекты
и обязательно объекты типа Figure:
function drawFigure(Figure $fig) {
$fig->Draw();
}
|
А если все-таки функции кто-то подсунет тип объекта не Figure, можно обработать это как исключение в отдельном классе -
где будут собраны все ошибочные ситуации. | |
|
|
|