X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

Открыть тему
Тема закрыта
> Абстрактные классы
romantik2011
romantik2011
Topic Starter сообщение 27.7.2011, 0:28; Ответить: romantik2011
Сообщение #1


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

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

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

$o1 = new B;
[/PHP]
Parse error: syntax error, unexpected ';', expecting T_FUNCTION in C:\www\htdocs\test.ru\www\index.php on line 11


Дальше, пробую по примеру в книге вот этот код, который в классе-родителе
вызывают функцию из производного класса, но интерпретатор тоже ругается.

[PHP]
<?php

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

?>
[/PHP]
Fatal error: Call to undefined function Test() in C:\www\htdocs\test.ru\www\index.php on line 7
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
romantik2011
romantik2011
Topic Starter сообщение 27.7.2011, 0:51; Ответить: romantik2011
Сообщение #2


Да, точно, меня интересует пример №1.
Скажите, какой же здесь полиморфизм, как говорится в книге, что мол в методе класса-родителя вызывается метод класса потомка, но объект же создаётся класса-потомка всё-таки.
Вот, смотрите:
[PHP]
$a->Call(); // выводит "Test from A" |объект создался от класса А, значит и функц. класса А вызывается
$b->Test(); // выводит "Test from B" |объект создался от класса B, значит и функц. класса B вызывается
$b->Call(); // Внимание! Выводит "Test from B"! |Так здесь наоборот вызывается метод из класса-родителя в классе-потомке, а не в классе-родителя вызывается метод потомка
[/PHP]

Если полиморфирзм - это когда метод в классе-родителе вызывает метод класса-потомка, я не вижу чтоб здесь в классе-родите вызывался метод-класса-потомка, объект всё равно же создаётся от потомка, а не от родителя.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
сообщение 27.7.2011, 1:03; Ответить: alexdrob
Сообщение #3


(romantik2011 @ 27.7.2011, 03:28) *
Parse error: syntax error, unexpected ';', expecting T_FUNCTION in C:\www\htdocs\test.ru\www\index.php on line 11

ну так после функции точку с запятой не ставят, это ставят после абстрактных только, а вы после всех поставили.

(romantik2011 @ 27.7.2011, 03:28) *
Fatal error: Call to undefined function Test() in C:\www\htdocs\test.ru\www\index.php on line 7

ну так правильно, функции Test и нет. Вам нужно вызвать функции класса. Пишите
[PHP]function Call() { $this->Test(); }[/PHP]
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
сообщение 27.7.2011, 1:11; Ответить: alexdrob
Сообщение #4


(romantik2011 @ 27.7.2011, 03:51) *
Да, точно, меня интересует пример №1.
Скажите, какой же здесь полиморфизм, как говорится в книге, что мол в методе класса-родителя вызывается метод класса потомка, но объект же создаётся класса-потомка всё-таки.
Вот, смотрите:
1
2
3
4
$a->Call(); // выводит "Test from A"* |объект создался от класса А, значит и функц. класса А вызывается
$b->Test(); // выводит "Test from B"* |объект создался от класса B, значит и функц. класса B вызывается
$b->Call(); // Внимание! Выводит "Test from B"!* |Так здесь наоборот вызывается метод из класса-родителя в классе-потомке, а не в классе-родителя вызывается метод потомка


Если полиморфирзм - это когда метод в классе-родителе вызывает метод класса-потомка, я не вижу чтоб здесь в классе-родите вызывался метод-класса-потомка, объект всё равно же создаётся от потомка, а не от родителя.

что то вы понаписали, не совсем понятно...


(romantik2011 @ 27.7.2011, 03:51) *
я не вижу чтоб здесь в классе-родите вызывался метод-класса-потомка

а это что?
(romantik2011 @ 27.7.2011, 03:28) *
$b->Call(); // Внимание! Выводит "Test from B"!


у класса B нет метода Call => метод Call вызван для родителя.
а метод родителя Call вызывает функцию Test
а функция тест родителя выводит Test from A
но в примере вы увидите Test from B
так как вы вызвали метод Call через класс B, у него нет своего метода Call и он как бы вызывает метод родителя, но тот в свою очередь вызывает метод объявленный в классе B
То есть получается что метод класса А вызвал метод класса Б

Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Тема имеет прикрепленные файлыНа постоянной основе продаю handmade мастер-классы, есть Новый год
Описание и уникальные фотографии
3 Вдохновение 3254 27.12.2018, 2:01
автор: Emtec
Открытая тема (нет новых ответов) Продаю Мастер-классы по декупажу
0 jemka 1612 2.3.2012, 11:55
автор: jemka


 



RSS Текстовая версия Сейчас: 28.3.2024, 23:18
Дизайн