是否有(或模式)强制调用父方法?
我有一个像这样的抽象类:
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()
方法,我们有可能忘记调用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(); //
Output:
APrimitive validate call.
CSophisticated call.
函数调用基本上执行以下操作:
foo.validate() -> APrimitive.validate() -> ASophisticated.overrideValidate() (or APrimitive.overrideValidate() if it wasn't overriden)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)