OOP类:根据被调用的方法覆盖子类中的静态方法

时间:2015-10-17 19:06:32

标签: class oop inheritance override static-methods

我有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中引入变量可以帮助我们在覆盖类中创建条件,但不知道如何实现所有这些。

1 个答案:

答案 0 :(得分:0)

据我所知,由于静态方法不是类实例的一部分,因此无法覆盖它。这是世界上每种编程语言的设计。

如果这些静态方法实例方法 ...

...可能你最终会实现两个ParentClass的派生类,并且在实例化所谓的派生类时会实现条件逻辑,这意味着你将利用多态

ParentClass instance;

if([condition])
{
    instance = new DerivedClass1();
}
else
{
    instance = new DerivedClass2();
}

    instance.OverriddenMethod();
}

当您将最派生的实例的引用转换为较少派生的实例时,您正在执行 upcast 。当您向上转播 DerivedClass1DerivedClass2时,您并没有失去OverriddenMethod的实施,因为向上转播只会减少键入时不会丢失实现细节。