Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Абстрактные классы (https://javascript.ru/forum/server/19133-abstraktnye-klassy.html)

romantik2011 27.07.2011 00:29

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

Вот написал элементарный код, без реализации, выдаёт ошибку:
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;

Цитата:

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

<?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"!

?>

Цитата:

Fatal error: Call to undefined function Test() in C:\www\htdocs\test.ru\www\index.php on line 7

ваый 27.07.2011 00:33

Тебе перевести сообщения на русский?

romantik2011 27.07.2011 00:51

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


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

tenshi 27.07.2011 10:28

http://ru.wikipedia.org/wiki/%D0%9F%...BD%D0%B8%D0%B5)


Часовой пояс GMT +3, время: 19:22.