PHP.在基类中使用将在派生中定义的方法


PHP. Use of methods in the base class which will be defined in the derived

在基类中使用将在派生类中定义的方法是一种好的做法吗?例如:

abstract class CApplication {
    use TSingleton;
    protected final function singletonInstanceInit() {
        if (php_sapi_name() == 'cli') {
            $this->initCLIApp();
    }
        else {
            $this->initWebApp();
        }
    }
}
abstract class CWebApplication extends CApplication {   
      protected function initWebApp() { }
}
abstract class CCLIApplication extends CApplication {
    protected function initCLIApp() { }
}

AFAIK这不是一个好的做法。

为了定义新的行为和新的特殊类型的对象,需要继承。这意味着你可以/*现在应该*写一个基类,并在晚些时候扩展它。

如果基类知道它的派生类的结构,这在某种程度上是契约,那么派生类需要来实现一些函数,以便与该基类一起工作,在这种情况下,脑海中会浮现出"契约设计"。

如果你需要在派生类中有一个特定的函数,也许它应该在基类中声明为abstract函数,或者在类实现的接口中声明为方法。

这样,基类了解派生类中实现的方法并非没有道理。

此外,AFAIK其他更严格的语言在编译器级别不允许这样做。您确实需要在c++Java中进行一些重构来实现这一点,就像我上面所说的那样,在基类或接口中使用抽象函数。

您所说的是两种不同的思想流派。我见过ruby开发人员做这样的事情,因为他们使用了mixin(是的,很多gem都这样做)。另一方面,若你们去问一个经典的Java程序员,他不会建议你们这么做。你刚刚在代码中显示的自由类型是只有动态类型语言才能给你的(是的,我知道有些人会点头说我使用了CGLib),它们可以用一种简单的方式实现静态类型语言,或者根本不使用。

长话短说,如果我是你,我会研究这个场景,并决定我是否需要这种黑魔法来完成给定的任务?只要不影响代码质量,就没有什么规则是坏的。