【发布时间】:2014-01-23 19:14:01
【问题描述】:
假设我有一个简单的类
class Master {
public $variable;
public function a_method() {
// some code here
}
}
以及覆盖父方法的子类
class Child extends Master {
public function a_method() {
// some other code
}
}
现在,用$child_object = new Child() 实例化Child 类,如果我调用方法$child_object->a_method(),当然会执行被覆盖的代码。如果我有条件地希望调用父方法而不是子方法,这取决于(例如)$child_object->variable 的值,但仅在Master::a_method() 内表达条件怎么办?简单来说,我想要类似的东西
class Master {
public $variable;
public function a_method() {
if ($this->variable) {
// execute the child's method if you are in an inherited scope
} else {
// some code here
}
}
}
我知道在条件块内调用parent::a_method() 对孩子的方法采取行动是微不足道的,但我希望孩子的方法对该条件视而不见。
【问题讨论】:
-
这听起来像是一个非常破碎的抽象。您正在尝试在父类中创建对子类的依赖,这不是一个好主意。 (父类应该不知道子类,更不用说对它的依赖了。)根据您要解决的问题,我想有一个解决它的模式。也许您希望工厂在另一个对象上提供父/子类型(在这种情况下应该是多态不可区分的),并且条件应该在 that 对象上?
-
欺骗中的答案应该显示如何调用覆盖方法的父副本。
-
为什么你觉得你只需要在
Master::a_method内部表达条件?这可能很重要。 -
因为我正在开发一个框架,这是为了便于配置。事实上,
Master类是在框架内部定义的,使用这个框架的人应该在不编写条件代码的情况下获得所需的行为(至少,这是我想要实现的)。
标签: php oop overriding