Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.07.2011, 00:32   #1
romantik2011
Пользователь
 
Регистрация: 20.07.2011
Сообщений: 70
По умолчанию Абстрактные классы

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

Вот написал элементарный код, без реализации, выдаёт ошибку:
PHP код:
abstract class Db{
    abstract function 
db_conn();     
    abstract function 
db_open();     
    abstract function 
db_query();    
    abstract function 
db_close();     
}

class 
extends Db{
    function 
db_conn() {}; 
    function 
db_open() {};     
    function 
db_query() {};    
    function 
db_close() {};  
}

$o1 = new B
Цитата:
Parse error: syntax error, unexpected ';', expecting T_FUNCTION in C:\www\htdocs\test.ru\www\index.php on line 11
Дальше, пробую по примеру в книге вот этот код, который в классе-родителе
вызывают функцию из производного класса, но интерпретатор тоже ругается.

PHP код:
<?php

class {
// Выводит, функция какого класса была вызвана
function Test() { echo "Test from A\n"; }
// Тестовая функция — просто переадресует на Test()
function Call() { Test(); }
}
class 
extends {
// Функция 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"!

?>
Цитата:
Fatal error: Call to undefined function Test() in C:\www\htdocs\test.ru\www\index.php on line 7
Да, точно, меня интересует пример №1.
Скажите, какой же здесь полиморфизм, как говорится в книге, что мол в методе класса-родителя вызывается метод класса потомка, но объект же создаётся класса-потомка всё-таки.
Вот, смотрите:
PHP код:
$a->Call(); // выводит "Test from A"  |объект создался от класса А, значит и функц. класса А вызывается
$b->Test(); // выводит "Test from B"  |объект создался от класса B, значит и функц. класса B вызывается
$b->Call(); // Внимание! Выводит "Test from B"!  |Так здесь наоборот вызывается метод из класса-родителя в классе-потомке, а не в классе-родителя вызывается метод потомка 
Если полиморфирзм - это когда метод в классе-родителе вызывает метод класса-потомка, я не вижу чтоб здесь в классе-родите вызывался метод-класса-потомка, объект всё равно же создаётся от потомка, а не от родителя.

Последний раз редактировалось romantik2011; 27.07.2011 в 00:52.
romantik2011 вне форума Ответить с цитированием
Старый 27.07.2011, 06:55   #2
mrgrudge
Форумчанин
 
Аватар для mrgrudge
 
Регистрация: 20.02.2010
Сообщений: 229
По умолчанию

Ну во первых думаю следует заменить
Код:
function Call() { Test(); }
}
на
Код:
function Call() { $this->Test(); }
}
это должно исправить ошибку
Код:
Fatal error: Call to undefined function Test() in C:\www\htdocs\test.ru\www\index.php on line 7
касательно полиморфизма, думаю следует дать разные навзвания функциям test в разных классах.
думай как баг, действуй как баг, и ты найдешь баг )
mrgrudge вне форума Ответить с цитированием
Старый 27.07.2011, 10:36   #3
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,624
По умолчанию

Цитата:
Вот написал элементарный код, без реализации, выдаёт ошибку:
PHP код:
class extends Db{
    function 
db_conn() {} 
    function 
db_open() {}     
    function 
db_query() {}    
    function 
db_close() {}  

Точа-запятая то зачем после {} в перекрывающих абстрактные методы методах?

Цитата:
Если полиморфирзм - это когда метод в классе-родителе вызывает метод класса-потомка, я не вижу чтоб здесь в классе-родите вызывался метод-класса-потомка, объект всё равно же создаётся от потомка, а не от родителя.
$this-> забыли то, как уже сказали
Стрелок-охотник
mv28jam вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
абстрактные св-ва, как сделать? Пепел Феникса C# (си шарп) 4 27.02.2011 19:47
С++ Абстрактные классы Jane-sad Помощь студентам 2 14.10.2010 14:19
Абстрактные классы. Опытным взглядом на 1 минуту работы Metal_666_ Общие вопросы C/C++ 5 15.02.2010 12:28
[C] Абстрактные типы данных. Реализация дерева общего вида. Dju Помощь студентам 0 11.05.2009 18:11