我正在创建一组用于测试某些数据的类 - 我有一个基类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()
来解决这个问题。
答案 0 :(得分:1)
如果您可以自由更改对测试类的调用,则可以添加另一个包装行为的函数
public function runTest(){
$this->startTime = microtime(true);
$this->Test();
$this->endTime = microtime(true);
}
答案 1 :(得分:1)
我认为不可能调用与父方法同名的子方法。首先,假设子类重写方法是不好的设计。强制子类实现方法是定义父抽象方法,但在这种情况下你就是不能。 Run()方法已经在父类中实现。
您应该使用抽象并使用其他名称。
这是一个可能适用于您的可能实现。您可以将基类定义为抽象类, TestForX 将扩展 Test 类,您将在该实例上调用 Run() TestForX
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
}
}