在子类中调用方法的最佳方法是什么。如果我尝试直接调用该方法,我的IDE总会显示错误。
class Base
{
public function DoIt()
{
$this->Generate(); //How to check if child implements Generate?
}
}
class Child extends Base
{
protected function Generate()
{
echo "Hi";
}
}
答案 0 :(得分:3)
简单地说,你不这样做。这是非常糟糕的设计:除了实现基础本身定义的契约之外,基类不应该假设任何有关其后代的内容。
最接近的可接受替代方法是在父节点上声明abstract protected function Generate()
,以便它知道所有派生类都实现它。当然,这并不是一个机械解决方案:只有Generate
对{em>所有后代Base
有意义时才应该这样做。
答案 1 :(得分:3)
问题是您的父类没有定义子类可以覆盖的Generate()
方法;你必须通过创建一个抽象方法来明确定义它:
// class with at least one abstract method is
abstract class Base
{
public function DoIt()
{
$this->Generate();
}
// child classes MUST implement this method
abstract protected function Generate();
}
您可以通过在父类中创建一个空实现来放松要求:
class Base
{
public function DoIt()
{
$this->Generate();
}
// child classes MAY implement this method
protected function Generate() {}
}