【发布时间】:2015-10-17 19:06:31
【问题描述】:
我有 ParentClass,方法是 TestMethod(注意:我根本不应该对 ParentClass 做任何更改,它应该保持原样):
class ParentClass{
public static function TestMethod() {
return "original method";
}
}
并且扩展原始类的子类有两个额外的方法(ChildMethod1和ChildMethod2)不包含在ParentClass中:
class ChildClass extends ParentClass{
public function ChildMethod1() {
.
.
.
}
public function ChildMethod2() {
.
.
.
}
}
我正在实例化并使用来自 ChildClass 的对象。但我需要从 ParentClass 覆盖 TestMethod。
在我调用 ChildMethod1 的那一刻,ParentClass 中的 TestMethod 应该被覆盖,看起来像这样:
public static function TestMethod() {
return "child method 1";
}
在我调用 ChildMethod2 的那一刻,应该像这样覆盖 TestMethod:
public static function TestMethod() {
return "child method 2";
}
所以可能 ChildClass 应该是这样的:
class ChildClass extends ParentClass{
public function ChildMethod1() {
.
.
.
}
public function ChildMethod2() {
.
.
.
}
public function TestMethod() {
if(some condition){
return "child method 1";
} else {
return "child method 2";
}
}
}
注意:ParentClass 中的 TestMethod 实际上是一个静态函数。
有没有什么方法可以在不改变 ParentClass 的情况下实现这个逻辑?我在想也许在 ChildClass 中引入变量可以帮助我们在覆盖类中创建条件,但不确定如何实现所有这些。
【问题讨论】:
-
静态方法永远不会被覆盖。它们可以通过在子类中使用相同的名称来隐藏(不好的做法),但是总是可以使用完全限定的成员名称调用静态方法,例如。
ParentClass.testMethod()。如果您需要在子类中覆盖testMethod(),那么您应该重构您的对象模型,使该方法成为ParentClass的实例方法。
标签: class oop inheritance overriding static-methods