OOP(PHP)-强制重写的方法根据父方法进行调用

卢卡·内特·马勒

我对此用例有一个普遍问题:我有一个class A此类具有非抽象方法doStuffCallback(),可以重写该方法,但并非每个子类都必需。但是:我想确保,如果该方法被重写,则子类方法必须调用父方法。

例:

abstract class A {
    private function doStuff() {
        $this->doStuffCallback();
    }

    protected function doStuffCallback() {
        // IMPORTANT CODE HERE
    }
}

class B extends A {
    protected function doStuffCallback() {
        parent::doStuffCallback(); // I want to enforce this because the parents method code is important

        // ALSO IMPORTANT CODE
    }
}

因为重写的方法执行相同的操作,所以为相同的职责定义两个方法以及同时调用这两个方法的私有帮助程序方法将非常难看。像这样:

abstract class A {
    private function doStuff() {
        $this->callDoStuffCallback();
    }

    private function callDoStuffCallback() {
        $this->internalDoStuffCallback();
        $this->doStuffCallback();

        // This is VERY ugly
    }

    private function internalDoStuffCallback() {
        // IMPORTANT CODE HERE
    }

    protected function doStuffCallback() {}
}

class B extends A {
    protected function doStuffCallback() {
        // IMPORTANT CODE
    }
}

这确实很丑陋且费力。所以我的问题PHP中是否有一种方法可以强制重写的方法调用Parents方法?

用户名

不。PHP中没有这种语言功能;这种限制在大多数“ OO”子类型中是不可能的。

相反,程序必须依赖明确的文档合同。并希望进行单元测试以确保一致性。


也可以使用防护措施,以便在某个父类上使用某个方法时,如果“当前状态”无效,则可能引发异常(例如,这样的方法未被调用)然而)。通过使调用(如文档合同中定义的)所需的子类某种特殊方法,而不是简单地重写super方法,也可以使此方法更加明确。但是,这在任何类型系统之外。

虽然self::范围可以被使用(如:调用哪个调用覆盖方法非覆盖方法),这将涉及进一步魔会造成死循环回路(例如,一些堆叠状态。); 而且不小心遗漏了用法也很容易。

我的建议是调用一个(私有)方法,该方法与所应用的任何逻辑相关联地调用此“可能被覆盖”的方法,如示例中所示(尽管希望有更多针对任务的驯服)。这样,就不需要或不需要(受保护的)替代方法来处理任何特殊逻辑本身。也不应在父类所建立的上下文之外直接调用它-这恰恰是它当前所声称的特殊回调。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章