2012-07-24 38 views
0

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

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

您应该将它们定义为基类中的抽象函数。 – Leigh 2012-07-24 13:27:06

+0

在什么情况下你必须这样做?并且不能避免 – 2012-07-24 18:08:08

+0

你可以像调用CWebApplication :: initWebApp()一样静态调用它们,但是你必须确保包含类文件,并且我不建议这样做只是为了解决 – 2012-07-24 18:11:15

回答

0

AFAIK这不是一个好的做法。

为了定义新的行为和新的特定类型的对象,需要继承。这意味着你应该*现在写一个基类并延迟一段时间。

如果基类有所了解它的结构,自己的派生类,这是一个合同,派生类需要来实现,以便与基类工作的一些功能有些在这种情况下,“契约式设计”弹簧去提醒。

如果您需要派生类中的某个函数,那么可能应该在基类中声明一个abstract函数,或者在类实现的接口中声明该方法。

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

另外AFAIK其他更严格的语言不会允许在编译器级别。你真的需要做一些重构,在c++Java中实现这一点,这与我上面在基类或接口中使用抽象函数时所说的内容是一致的。

0

你在说什么是2种不同的思想流派。我见过Ruby开发者正在做这样的事情,因为他们在使用mixins(是的,很多宝石都是这样做的)。另一方面,如果你去问一个经典的Java程序员,他不会推荐你这样做。你刚刚在你的代码中显示的自由类型是只有动态类型语言给你(我知道有些人会点头说我使用了CGLib),它们可以用静态类型语言的黑客方式实现,或者它们不是完全可以使用。

长话短说,如果我是你,我会看看情景,并决定是否需要这样的黑魔法为我的给定任务或不?没有规则是不好的,只要它不损害代码质量。

相关问题