За последние 24 часа нас посетили 49195 программистов и 1758 роботов. Сейчас ищут 758 программистов ...

Абстрактные классы

Тема в разделе "PHP для новичков", создана пользователем romantik2011, 27 июл 2011.

  1. romantik2011

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

    С нами с:
    23 июл 2011
    Сообщения:
    26
    Симпатии:
    0
    Изучаю полиморфизм - способность класса-родителя использовать функции, классов-потомков, даже если неизвестно реализованы функции-потомков или нет.

    Вот написал элементарный код, без реализации, выдаёт ошибку:
    PHP:
    1.  
    2. abstract class Db{
    3.     abstract function db_conn();    
    4.     abstract function db_open();    
    5.     abstract function db_query();    
    6.     abstract function db_close();    
    7. }
    8.  
    9. class B extends Db{
    10.     function db_conn() {};
    11.     function db_open() {};    
    12.     function db_query() {};    
    13.     function db_close() {};  
    14. }
    15.  
    16. $o1 = new B;
    17.  
    Дальше, пробую по примеру в книге вот этот код, который в классе-родителе
    вызывают функцию из производного класса, но интерпретатор тоже ругается.

    PHP:
    1. <?php
    2.  
    3. class A {
    4. // Выводит, функция какого класса была вызвана
    5. function Test() { echo "Test from A\n"; }
    6. // Тестовая функция — просто переадресует на Test()
    7. function Call() { Test(); }
    8. }
    9. class B extends A {
    10. // Функция Test() для класса B
    11. function Test() { echo "Test from B\n"; }
    12. }
    13. $a=new A();
    14. $b=new B();
    15. $a->Call(); // выводит "Test from A"
    16. $b->Test(); // выводит "Test from B"
    17. $b->Call(); // Внимание! Выводит "Test from B"!
    18.  
    19. ?>
    Да, точно, меня интересует пример №1.
    Скажите, какой же здесь полиморфизм, как говорится в книге, что мол в методе класса-родителя вызывается метод класса потомка, но объект же создаётся класса-потомка всё-таки.
    Вот, смотрите:
    PHP:
    1.  
    2. $a->Call(); // выводит "Test from A"  |объект создался от класса А, значит и функц. класса А вызывается
    3. $b->Test(); // выводит "Test from B"  |объект создался от класса B, значит и функц. класса B вызывается
    4. $b->Call(); // Внимание! Выводит "Test from B"!  |Так здесь наоборот вызывается метод из класса-родителя в классе-потомке, а не в классе-родителя вызывается метод потомка
    5.  
    Если полиморфирзм - это когда метод в классе-родителе вызывает метод класса-потомка, я не вижу чтоб здесь в классе-родите вызывался метод-класса-потомка, объект всё равно же создаётся от потомка, а не от родителя.
     
  2. iliavlad

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

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    постарайся починить ошибки
     
  3. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    ты неправильно вызываешь функцию Test
     
  4. Котэ

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

    С нами с:
    20 июл 2011
    Сообщения:
    35
    Симпатии:
    0
    пример из книжки ?!
    вот это такое в книжке написано function db_conn() {};

    function Call() { Test(); } - ну и это тоже интересно :)

    и называй функции с маленькой буквы, это всего лишь хороший тон, но тем не менее...