gpt4 book ai didi

php - 强制调用父方法

转载 作者:可可西里 更新时间:2023-10-31 23:05:45 25 4
gpt4 key购买 nike

有没有(或模式)强制调用父方法?

我有一个像这样的抽象类:

abstract class APrimitive{
public function validate(){
//Do some stuff that applies all classes that extend APrimitive
}
}

然后我有扩展 APrimitive“基础”的类:

class CSophisticated extends APrimitive{

public function validate(){
//First call the parent version:
parent::validate();

//Then do something more sophisticated here.
}
}

问题是,如果我们在几个月后回过头来查看代码,并使用 validate() 方法创建更多类,如 CSophisticated,我们可能会忘记在该方法中调用 parent::validate()

请注意,某些 CSophisticated 类可能没有 validate() 方法,因此将调用父版本。

我知道可以在某处添加注释,以提醒程序员调用 parent::validate(),但是有更好的方法吗?如果对 parent::validate() 的调用不是在 validate() 方法中进行的,或许一种自动抛出异常的方法会很好。

最佳答案

您可以通过以下方式强制调用:

abstract class APrimitive{
final public function validate(){
//do the logic in validate
overrideValidate();
}
protected function overrideValidate(){
}
}

class CSophisticated extends APrimitive{

protected function overrideValidate(){

}
}

现在只允许调用 validate,这将依次调用您重写的方法。语法可能有点偏差(PHP 不是我选择的语言),但该原则适用于大多数 OOP 语言。

进一步说明:

abstract class APrimitive{
public function validate(){
echo 'APrimitive validate call.';
overrideValidate();
}
protected function overrideValidate(){
}
}

class CSophisticated extends APrimitive{

protected function overrideValidate(){
echo 'CSophisticated call.';
}
}

CSophisticated foo;
foo.overrideValidate(); //error - overrideValidate is protected
foo.validate(); //

输出:

APrimitive validate call.
CSophisticated call.

函数调用主要做以下事情:

foo.validate() -> APrimitive.validate() -> ASophisticated.overrideValidate() (or APrimitive.overrideValidate() if it wasn't overriden)

关于php - 强制调用父方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8005951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com