我有ParentClass,方法是TestMethod(注意:我根本不应对ParentClass进行任何更改,它应保持原样):
class ParentClass{
public static function TestMethod() {
return "original method";
}
}
扩展原始类的子类有两个不包含在ParentClass中的附加方法(ChildMethod1和ChildMethod2):
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中引入变量可以帮助我们在覆盖类中创建条件,但不知道如何实现所有这些。
答案 0 :(得分:0)
据我所知,由于静态方法不是类实例的一部分,因此无法覆盖它。这是世界上每种编程语言的设计。
...可能你最终会实现两个ParentClass
的派生类,并且在实例化所谓的派生类时会实现条件逻辑,这意味着你将利用多态:
ParentClass instance;
if([condition])
{
instance = new DerivedClass1();
}
else
{
instance = new DerivedClass2();
}
instance.OverriddenMethod();
}
当您将最派生的实例的引用转换为较少派生的实例时,您正在执行 upcast 。当您向上转播 DerivedClass1
或DerivedClass2
时,您并没有失去OverriddenMethod
的实施,因为向上转播只会减少键入时不会丢失实现细节。