0

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

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

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

现在(我认为)我希望我的所有控制器都扩展 FrontController 以便它们都可以访问一组共享的方法和属性,但我不希望它们继承该route()方法,因为这可能会导致无限环形。但是,如果该route()方法被标记为私有,那么我就无法如上所示实例化该对象。

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

有没有办法从继承中排除某些方法而不将它们标记为私有?还是应该换个角度看问题?

4

3 回答 3

2

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

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

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

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

于 2013-01-22T13:07:34.827 回答
1

还是应该换个角度看问题?

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

于 2013-01-22T13:12:28.393 回答
1

您是在问是否可以选择性地“关闭”继承的项目?恐怕这个答案是“不”,这基本上是根据定义。

两种选择:

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

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

imo 这两种方法都很丑陋。当我年轻的时候(呃),我曾经对其中哪一个更可取持怀疑态度,但我早就放弃了,因为它基本上是一个六分球和两个三分球。我认为,如果有的话,这取决于您所写的实际环境中的规范。

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

于 2013-01-24T15:36:02.150 回答