我正在创建一组用于测试一些数据的类-我有一个基类Test
:
class Test {
protected $data;
public function __construct($data) {
$this->data = $data;
}
public function Run() {}
}
然后是一系列扩展了Test的类,如TestForX
:
class TestForX extends Test {
public function Run() {
// do test code
}
}
我想给我的Run方法添加一些计时。我知道我可以在我的基类中添加startTiming
和endTiming
的方法,并在我的扩展类中调用parent::startTiming()
和parent::endTiming()
,但是我已经编写了大量的测试。
是否有可能扭转这一局面,并在我的基类中使用child::Run
之类的东西?
class Test {
public function Run() {
$this->startTime = microtime(true);
child::Run();
$this->endTime = microtime(true);
}
}
这将允许我通过在基类中包装方法来保持子类的整洁。目前,我通过为Test::Go
调用$this->Run()
的基类来绕过它。
如果您可以自由地更改对测试类的调用,您可以添加另一个函数来包装您的行为
public function runTest(){
$this->startTime = microtime(true);
$this->Test();
$this->endTime = microtime(true);
}
我认为不可能调用与父方法同名的子方法。首先,假设子类覆盖方法是糟糕的设计。强制一个子类实现一个方法就是定义一个父类抽象方法,但是在这种情况下你不能这样做。Run()方法已经在父类中实现了。
您应该使用抽象并使用不同的名称。
这是一个可能适合你的实现。你可以把你的基类定义为一个抽象类,TestForX将扩展Test类,你将在TestForX的实例上调用Run()。
abstract class Test {
protected $data;
abstract public function RunChild();
public function __construct($data) {
$this->data = $data;
}
public function Run() {
$this->startTime = microtime(true);
$this->RunChild();
$this->endTime = microtime(true);
}
}
class TestForX extends Test {
public function RunChild() {
// do test code
}
}