Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Принудительный вызов метода класса-потомка

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: не изменяя базовый класс
MADONZY
Отправлено: 28 Января, 2015 - 10:18:57
Post Id


Гость


Покинул форум
Сообщений всего: 104
Дата рег-ции: Июнь 2013  


Помог: 0 раз(а)




Здравствуйте! Подскажи как, если это возможно, принудительно вызвать метод класса-потомка не изменяя базовый класс. На пример:

PHP:
скопировать код в буфер обмена
  1. <?
  2.  
  3.  
  4.     class A {
  5.        
  6.         function test($param) {
  7.             echo __CLASS__.' '.$param;
  8.         }
  9.        
  10.     }
  11.  
  12.     class B extends A {
  13.        
  14.         function test($param) {
  15.             echo __CLASS__.' '.$param;
  16.         }
  17.  
  18.     }
  19.  
  20.  
  21.  
  22.     $a = new A;
  23.     $a->test('some text'); // тут должен вызваться метод test() класса B: 'B some text'


или же со статическими методами:

PHP:
скопировать код в буфер обмена
  1. <?
  2.  
  3.  
  4.     class A {
  5.        
  6.         static function test($param) {
  7.             echo __CLASS__.' '.$param;
  8.         }
  9.        
  10.     }
  11.  
  12.     class B extends A {
  13.        
  14.         static function test($param) {
  15.             echo __CLASS__.' '.$param;
  16.         }
  17.  
  18.     }
  19.  
  20.     A::test('some text'); // тут должен вызваться статический метод test() класса B: 'B some text'


Может есть какой-то шаблон проэктирования для таких случаев?
Заранне, спасибо!
 
 Top
Ch_chov
Отправлено: 28 Января, 2015 - 10:45:32
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




У класса A может быть несколько наследников, поэтому никак.

MADONZY пишет:
Может есть какой-то шаблон проэктирования для таких случаев?

Ну так опишите свой случай.
 
 Top
MADONZY
Отправлено: 28 Января, 2015 - 11:01:37
Post Id


Гость


Покинул форум
Сообщений всего: 104
Дата рег-ции: Июнь 2013  


Помог: 0 раз(а)




Ch_chov пишет:
У класса A может быть несколько наследников, поэтому никак.

MADONZY пишет:
Может есть какой-то шаблон проэктирования для таких случаев?

Ну так опишите свой случай.


2 варианта:
1) Есть класс A который наследуется от класа Х. В нем есть метод test (возможно статический). Где-то далеко-далеко в коде этот метод вызывается. Класс A это член стандартных классов какого-то фреймвока, котовый я не хочу изменять. Я же хочу создать свой дополнительный класс B который наследует класс А и в нем я надпишу (возможно статический) метод test. И я хочу что-бы в том далеком-далеком месте где вызывается метод test класса А, не изменяя этот вызов, вызывался метод test класса B.

2) Есть класс A который наследуется от класа Х. В нем есть метод test (возможно статический). Где-то далеко-далеко в коде этот метод вызывается. Класс A это член стандартных классов какого-то фреймвока, котовый я не хочу изменять. Я же хочу создать свой дополнительный класс B который наследует класс X и в нем я надпишу (возможно статический) метод test. И я хочу что-бы в том далеком-далеком месте где вызывается метод test класса А, не изменяя этот вызов, вызывался метод test класса B.
 
 Top
armancho7777777 Супермодератор
Отправлено: 28 Января, 2015 - 12:21:55
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




MADONZY пишет:
PHP:
скопировать код в буфер обмена
  1. $a->test('some text'); // тут должен вызваться метод test() класса B: 'B some text'

Сами-то понимаете, чего хотите ?
Откуда классу A знать, что нужен метод именно этого дочернего класса, а не "С", или "D" ?
Создайте экземпляр объекта класса B и вызывайте.
 
 Top
MADONZY
Отправлено: 28 Января, 2015 - 13:06:06
Post Id


Гость


Покинул форум
Сообщений всего: 104
Дата рег-ции: Июнь 2013  


Помог: 0 раз(а)




armancho7777777 пишет:
MADONZY пишет:
PHP:
скопировать код в буфер обмена
  1. $a->test('some text'); // тут должен вызваться метод test() класса B: 'B some text'

Сами-то понимаете, чего хотите ?
Откуда классу A знать, что нужен метод именно этого дочернего класса, а не "С", или "D" ?
Создайте экземпляр объекта класса B и вызывайте.


В том то и дело что понимаю, но думал что народные умельцы что-то придумали Улыбка
 
 Top
Bio man
Отправлено: 28 Января, 2015 - 15:01:07
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




MADONZY пишет:
В том то и дело что понимаю, но думал что народные умельцы что-то придумали
Придумать то можно, но это противоречит базовым принципам ООП, и потому такой хернёй никто не страдает.
Смотри в сторону полиморфизма и порождающих паттернов.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB