【问题标题】:OOP classes: Override static method in child class, depending of called methodOOP 类:覆盖子类中的静态方法,取决于被调用的方法
【发布时间】: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


【解决方案1】:

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

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

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

ParentClass instance;

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

    instance.OverriddenMethod();
}

当您将派生程度最高的实例的引用转换为派生程度较低的实例时,您正在执行向上转换。当您向上转换 DerivedClass1DerivedClass2 时,您并没有丢失他们对OverriddenMethod 的实现,因为向上转换 只是减少了输入,而不会丢失实现细节.

【讨论】:

    猜你喜欢
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 2017-08-27
    • 2014-07-29
    • 2014-12-18
    相关资源
    最近更新 更多