У меня 2 класса:
class animal{ public function walk(){ walk; } } class human extends animal{ public function walk(){ with2legs; } }
Таким образом, если я вызываю human-> walk (), он работает только с2legs;
Но я хочу, чтобы прогуливалась прогулка родителя; слишком.
Я знаю, что могу изменить его так:
class human extends animal{ public function walk(){ parent::walk(); with2legs; } }
Но проблема в том, что у меня много подклассов, и я не хочу помещать parent :: walk (); в каждую прогулку ребенка (). Есть ли способ расширить метод, например, расширить класс? Без переопределения, но действительно расширения метода. Или есть лучшие альтернативы?
Благодарю.
Я бы использовал понятия "hook"
и abstraction
:
class animal{ // Function that has to be implemented in each child abstract public function walkMyWay(); public function walk(){ walk_base; walkMyWay(); } } class human extends animal{ // Just implement the specific part for human public function walkMyWay(){ with2legs; } } class pig extends animal{ // Just implement the specific part for pig public function walkMyWay(){ with4legs; } }
Таким образом, мне просто нужно позвонить:
// Calls parent::walk() which calls both 'parent::walk_base' and human::walkMyWay() $a_human->walk(); // Calls parent::walk() which calls both 'parent::walk_base' and pig::walkMyWay() $a_pig->walk();
заставить ребенка идти своим путем …
См. Шаблон метода шаблона .