从继承中排除方法(不包括:private)

时间:2013-01-22 13:01:03

标签: php oop

我有一个前控制器,实例化如下:

$request = new FrontController();
$request->route();

route()方法然后根据请求动态调用适当的控制器。

现在(我想)我希望我的所有控制器都扩展FrontController,这样他们就可以访问一组共享的方法和属性,但我不希望它们继承route()方法因为这可能导致无限循环。但是,如果将route()方法标记为私有,则无法实例化上述对象。

我找到的唯一解决方案是从FrontController的构造函数中调用self::route(),然后在每个子控制器中定义一个空白构造函数。这只是感觉草率。

有没有办法从继承中排除某些方法而不将它们标记为私有?或者我应该从另一个角度看问题吗?

3 个答案:

答案 0 :(得分:2)

您可以将final修饰符添加到方法之前,以防止它被子类化覆盖。

class FrontController{
   final public function route() {
       // ...
   }
}

有关更多示例和详细说明,请参阅以下PHP手册条目:

http://php.net/manual/en/language.oop5.final.php

答案 1 :(得分:1)

  

或者我应该从另一个角度看问题?

最有可能,是的。首先,您应该考虑一下您要解决的问题,因为我甚至没有看到那里的真正问题。从你所写的内容来看,没有无限循环的风险。

答案 2 :(得分:1)

您是否在询问是否可以选择性地“关闭”继承的项目?对此的答案是“不”,我担心,这基本上是按照定义。

两种选择:

在子类中,你不想实现这样的方法(/ property),你可以覆盖它并返回某种“未实现”的结果。

在层次结构中创建一系列基类,如果可以的话,在最后一个上构建每个基类。然后您的子类可以从其中一个基类继承,但您不一定要让所有子类继承自同一个基类。

imo这两种方法都非常难看。当我年轻的时候(呃)我曾经说过哪些更好,但我早就放弃了,因为它基本上是六和两个三分。我认为,如果有的话,这取决于你所写的实际环境中的规范是什么。

但是大概如果你坐下来思考它,你就会明白为什么继承会以这种方式实现。