Учитывая базовый класс, где у меня есть некоторая логика, которая должна выполняться до и после определенного метода, который принимает совершенно разные параметры в своих различных производных классах.
Как пример:
abstract class Base{
public function pre(){ print "Runing Base::pre()\n"; }
public function pos(){ print "Runing Base::post()\n"; }
abstract public function doIt();
}
class Cheating extends Base
{
public function doIt(){
$this->pre();
print "Doing it the cheating way\n";
$this->pos();
}
}
Но на самом деле я хотел бы сделать следующее:
class Alpha extends Base
{
public function doIt($x, $y){
print "Doing it in Alpha with x=$x, y=$y";
}
}
class Beta extends Base
{
public function doIt($z){
print "Doing it in Alpha with z=$z";
}
}
И есть способ всегда запускать методы pre и pos без необходимости изменения самого метода doIt.
Очевидный способ, должен ли он быть однородным по всем производным от Base, будет примерно таким:
abstract class Base
{
public function pre(){ print "Runing Base::pre()\n"; }
public function pos(){ print "Runing Base::post()\n"; }
public function process($a,$b){
$this->pre();
$this->doIt($a,$b);
$this->pos();
}
abstract public function doIt();
}
class Wishful extends Base
{
public function doIt($a, $b){
print "Doing it the Wishful way with a=$a, b=$b\n";
}
}
Проблема в том, что, поскольку у нас есть разные числа и типы параметров в каждой реализации doIt, это фактически не решает проблему.
Это звучит как случай "зацепок" - как их реализовать? Или любой другой достойный способ решения проблемы ... Я полагаю, что должен быть более простой способ, который я просто упускаю - вероятно, думая в кругах одну неправильную вещь.
Спасибо!