0

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

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() { }
}
4

2 回答 2

0

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

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

于 2012-07-24T13:55:28.657 回答
0

AFAIK 这不是一个好习惯。

为了定义新的行为和新的特殊类型的对象,需要继承。这意味着您现在可以/*应该*编写一个基类并在稍后的某个时间对其进行扩展。

如果基类知道它的派生类的结构,这在某种程度上是一种契约,那么派生类需要实现一些功能才能与该基类一起工作,在这种情况下,就会想到“契约式设计”。

如果您需要在派生类中具有某个函数,则可能应将其声明为abstract基类中的函数或该类实现的接口中的方法。

这样,基类知道派生类中实现的方法并不是不合理的。

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

于 2012-07-24T13:28:37.630 回答