【问题标题】:How to solve this without multiple inheritance?如何在没有多重继承的情况下解决这个问题?
【发布时间】:2011-12-04 06:36:08
【问题描述】:

我的班级名为Controller_Home。它应该继承自Controller_PermissionsController_Template。任何以Controller_ 为前缀的类都必须继承自Controller 类。

如果 PHP(我的例子)支持多重继承,我可以这样做:

class Controller_Home extends Controller_Permissions, Controller_Template {

还有Controller_PermissionsController_Template

Controller_Permissions extends Controller {

Controller_Template extends Controller {

现在我需要做这样的事情:

class Controller_Home extends Controller_Template {

class Controller_Permissions extends Controller_Template {

Controller_Template extends Controller {

好的,成功了!

现在我需要在没有权限的情况下使用Controller_Template(在Controller_Permissions)。

如何在不重复代码的情况下做到这一点?我不想再上课Controller_TemplateWithoutPermissions

控制器、模板和权限只是示例。

【问题讨论】:

  • 你假设多重继承很好地解决了这个问题。我不同意,我想你会得到的大多数答案都是一样的。我建议您将标题更改为:“如何在没有多重继承的情况下解决此问题”。

标签: php oop inheritance class-design multiple-inheritance


【解决方案1】:

多重继承的常见替代方法是使用组合。这使得关系成为“具有”而不是“是”关系。即在您上面的示例中,您可能有 ControllerHome 从 ControllerTemplate 继承,但持有一些 ControllerPermissions 作为变量。这样,ControllerHome 是一个 ControllerTemplate 并且有一个 ControllerPermissions。

【讨论】:

    【解决方案2】:

    在这种情况下你可以使用Traits

    Traits 与 mixins 类似,但 mixins 只能使用继承操作来组合,traits 提供了更广泛的操作选择,包括对称求和、方法排除和别名。 Trait 与抽象类型的不同之处在于它提供了其方法的实现,而不仅仅是类型签名。

    特征在PHP 5.4 中可用,在Scala 中很常见。

    【讨论】:

    • 听起来不错,但有一个小问题... PHP 5.4。任何其他解决方案,人们? :)
    • @daGrevis 我希望我能对 cme​​ts 投反对票。这是一个非常无意义和怪诞的。实际上,鉴于您的知识贫乏(这在您的问题中很明显),我想知道您如何判断语言是否好。
    • @deadalnix PHP 5.4 可能对他或他的客户不可用。
    • @leo,这可能是真的,但超出了问题的范围。
    【解决方案3】:

    这根本没有什么好看的。您所有的类都非常紧密地耦合在一起。定义,然后在对象上实现接口,并使用聚合来构建“有权限”和“无权限”类型是一种更干净、更“漂亮”的解决方案。它还允许 IoC(如果您是一个坚定的 SOLID 人,它会破坏封装),这可以为您提供更好的单元测试场景,并允许使用 DI 容器。

    【讨论】:

      猜你喜欢
      • 2023-02-25
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多