За последние 24 часа нас посетили 62793 программиста и 1781 робот. Сейчас ищут 817 программистов ...

Полиморфизм и его особенности

Тема в разделе "PHP для новичков", создана пользователем Golovastik, 7 дек 2010.

  1. Golovastik

    Golovastik Активный пользователь

    С нами с:
    14 июл 2010
    Сообщения:
    193
    Симпатии:
    0
    Скажите в двух словах, какой главный смысл полиморфизма(читал что 1 интерфейс и множество реализаций), и приведенный код нже демонстрирует ли полиморфизм?

    PHP:
    1.  
    2. <?php header('content-type: text/html;charset=utf-8'); ?>
    3. <?
    4.     // Класс Фигуры (какой фигуры - неизвестно. просто фигуры)
    5.     abstract class Figure {
    6.         abstract public function Draw(); // абстрактный метод «Нарисовать фигуру»
    7.     }
    8.  
    9.     // Класс Треугольника
    10.     class Triangle extends Figure {
    11.         public function Draw() {  // метод «Нарисовать треугольник»
    12.             echo 'рисуем треугольник '.'<br/>';
    13.          }
    14.     }
    15.  
    16.     // Класс Эллипса
    17.     class Ellipse extends Figure {
    18.         public function Draw() {  // метод «Нарисовать эллипс»
    19.             echo 'рисуем эллипс '.'<br/>';
    20.         }
    21.     }
    22.    
    23.     // Класс Круга
    24.     class Circle {
    25.         public function Draw() {  // метод «Нарисовать круг»
    26.             echo 'рисуем круг '.'<br/>';
    27.         }
    28.     }
    29.  
    30.     // Класс Прямоугольника
    31.     class Rectangle extends Figure {
    32.         public function Draw() {  // метод «Нарисовать прямоугольник»
    33.             echo 'рисуем прямоугольник '.'<br/>';
    34.         }
    35.     }
    36.  
    37.  
    38.  
    39.     // обыкновенная функция рисования фигуры
    40.     function drawFigure($fig) {
    41.         if ($fig instanceof Figure) {
    42.             $fig->Draw(); // тут мы на этапе написания этой функции не знаем,
    43.                           // какая именно фигура будет рисоваться, а интерпретатор
    44.                           // php это знает только на этапе выполнения скрипта
    45.         } else {
    46.             echo 'Неизвестная фигура';
    47.         }
    48.     }
    49.  
    50.  
    51.     // создадим фигуры
    52.     $triangle  = new Triangle();  // треугольник
    53.     $ellipse   = new Ellipse();   // эллипс
    54.     $rectangle = new Rectangle(); // прямоугольник
    55.     $circle    = new Circle();    // круг
    56.    
    57.     // нарисуем прямоугольник
    58.     drawFigure($rectangle);
    59.    
    60.     // нарисуем эллипс
    61.     drawFigure($ellipse);
    62.    
    63.     // попытаемся нарисовать круг
    64.     drawFigure($circle);
    65. ?>
    66.  
    НЕ понятно вот это место:
    PHP:
    1.  
    2. //Скажите $fig в этот параметр передаются объекты в качестве параметра
    3. //и вот эта переменная $fig превращается в объект?
    4.      function drawFigure($fig) {
    5.         if ($fig instanceof Figure) {     //А здесь сравнивается является ли объект под названием  $fig
    6. //объектом класса под названием Figure?
    7.      $fig->Draw();
    8.                          } else {
    9.             echo 'Неизвестная фигура';
    10.         }
    11.     }
    12.  
     
  2. shurastik

    shurastik Активный пользователь

    С нами с:
    22 фев 2008
    Сообщения:
    285
    Симпатии:
    0
    Адрес:
    Латвия
    демонстрирует

    ничего там не превращается - что подал, то и будет

    c пятой версии php можно написать так:

    PHP:
    1.  
    2. <?php
    3. function drawFigure(Figure $fig) {
    4.     $fig->Draw();
    5. }
    6. ?>
    7.  
    Функция примет в качестве параметра объект Figure (но т.к. он у тебя абстрактный, ты всё равно не сможешь его создать), или любого его наследника (независимо от глубины наследования). Всё остальное выкинет fatal error.
    Соль в том, что функция работает с интерфейсом, она знает, что у объекта должен быть метод Draw(), а реализация ей глубоко побоку
     
  3. Golovastik

    Golovastik Активный пользователь

    С нами с:
    14 июл 2010
    Сообщения:
    193
    Симпатии:
    0
    1)Я хотел спросить, какой смысл полиморфизма?
    Напишите маленький скромный пример,чтоб понят зачем он вообще или просто его использовать потому-что это ООП?
    2)Абстрактный класс и интерфейс, в чём гласный смысл того и другого?
    Интерфейс нужен чисто для того чтоб объявить в нём свойства разные и методы, а потом реализовать в других классах которые унаследуют этот интерфейс и всё?
    А Абстрактный класс нужен для чего в основном, ну смысл его зачем.
    Дело в том что в разных источниках пишут в общем смысле, а конкретно не понять, зачем то и другое?
     
  4. shurastik

    shurastik Активный пользователь

    С нами с:
    22 фев 2008
    Сообщения:
    285
    Симпатии:
    0
    Адрес:
    Латвия
    вот здесь более реальный пример с чтением/записью
    http://wiki.agiledev.ru/doku.php?id=ooad:dependency_injection
    суть в том, что общий алгоритм не меняется, можно подменить части системы


    В принципе, это одно и то же, только в абстрактном классе можно ещё описать какие-то детали реализации, которые общие для всех наследников.
     
  5. VItalijs

    VItalijs Активный пользователь

    С нами с:
    17 дек 2008
    Сообщения:
    244
    Симпатии:
    0
    Адрес:
    Рига, Латвия
    абстрактные классы, интерфейсы, пространства имен и т.д. нужны для программистов, что бы писать меньше и думать меньше о зависимостях в коде, о том что, как и где используется. Если, например, есть три программиста которые пишут одну программу. И там нужно создать класс вывода какой-то информации. 1-й программист пишет класс для вывода в xml формате, 2-q пишет класс для вывода в текстовый файл как есть, а 3-й пишет часть программы которая и работает с этими классами. Так вот знать какие методы понаписали 1-й и 2-й трудновато, но если оба их класса реализуют один и тот же интерфейс вывода информации, то реализация этих классов не важна и можно работать с интерфейсом, при том еще и вполне спокойно заменить один класс на другой, в зависимости от необходимости.

    ну по крайней мере я так понимаю это, хотя у меня с ооп не супер.