在基类中使用将在派生类中定义的方法是一种好习惯吗?例如:
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() { }
}
答案 0 :(得分:0)
AFAIK这不是一个好习惯。
为了定义新行为和新的特殊类型的对象,需要继承。这意味着你可以 / *应该*现在写一个基类并在一段时间后延长它。
如果基类知道它的派生类的结构有点像是契约,那么派生类需要来实现一些函数才能使用那个基类,在这种情况下“设计通过合同“浮现在脑海中。
如果你需要在派生类中拥有某个函数,那么它应该在基类中声明为abstract
函数,或者作为类实现的接口中的方法。
这样,基类就知道派生类中实现的方法是不合理的。
AFAIK其他更严格的语言也不允许在编译器级别使用它。您真的需要进行一些重构,以便在c++
或Java
中使用基类或接口中的抽象函数执行此操作。
答案 1 :(得分:0)
你所说的是两种不同的思想流派。我见过ruby开发人员做这样的事情,因为他们使用mixins(是的,很多宝石就是这样)。另一方面,如果你去问一位经典的Java程序员,他不会建议你这样做。你在代码中展示的自由类型只是动态类型语言给你的东西(我知道有些人会点头说我使用了CGLib),它们可以用一种黑客方式实现静态类型语言,或者它们不是一点也没用过。
长篇故事简短,如果我是你,我会调查情景,并决定我是否需要这样的黑魔法来完成我的任务?只要它不会损害代码质量,任何规则都是不好的。