Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Полиморфизм и его особенности
 
 автор: Golovastik   (07.12.2010 в 14:45)   письмо автору
 
 

Скажите в двух словах, какой главный смысл полиморфизма(читал что 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 'Неизвестная фигура';
        }
    }

  Ответить  
 
 автор: Лена   (07.12.2010 в 23:29)   письмо автору
 
   для: Golovastik   (07.12.2010 в 14:45)
 

Смысл полиморфизма.
В базовом классе существует некий виртуальный метод, который можно "переопределить" в производном классе.
Метод базового класса как бы перезаписывается методом производного класса.
Чаще всего это происходит, когда базовый класс - абстрактный и в нем есть абстрактный метод,
который ожидает своей реализации в производных классах, иначе смысла его использования нет.
Я бы назвала все это "Схема(или описание) - конкретная реализация схемы".
У вас схема - класс фигуры, конкретно схему реализуют производные от этого классы.

>НЕ понятно вот это место:
У вас есть функция drawFigure, у которой один входной параметр - $fig. У вас сейчас написано так, что функции все равно,
какой у нее будет входной парамер - просто переменная или объект. Но дальше стоит "шлагбаум" - условие, которое проверяет параметр $fig - этот параметр
должен быть объектом типа Figure, т.е. объект обязательно должен быть наследником класса Figure.
Вы в функцию запихиваете только объекты, поэтому я бы сразу же в параметре функции и указывала, что мне нужны только объекты
и обязательно объекты типа Figure:

     function drawFigure(Figure $fig) { 
     $fig->Draw(); 
    } 



А если все-таки функции кто-то подсунет тип объекта не Figure, можно обработать это как исключение в отдельном классе -
где будут собраны все ошибочные ситуации.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования