奇怪的多重继承的优雅替代品

Cat*_*rin 4 php oop multiple-inheritance

我不能说这是一个问题,但更多的是一个意见请求,我相信很多其他人可以从澄清这个问题中受益.

这是我的实际案例:

我有一个名为DataExchangeService的抽象类和许多扩展此类的子类(这是我的MVC框架中的基本CONTROLLER类).处理数据定义的管理模块(用户,类型,部分等)在大多数情况下都具有100%相似性的添加,编辑,删除,列表方法.我知道,因为我只使用搜索和替换来复制它们.现在问题不是我的所有DateExchangeService子类都处理数据定义,因此有足够的情况我不需要CRUD方法.

多重继承会定义这些CRUD方法及其在另一个类中的行为,并且会在需要的地方扩展这两个类,但我确实认为它是棘手的东西,我不使用它(+ PHP没有这样的功能).那么最佳做法是什么?

以下是我想到的方法:

案例A

  1. 定义一个CRUDHandler类,其中包含所有这些参数化方法.

  2. 在需要的地方创建CRUDHandler类型的属性,并实现将迫使我使用这些方法的CRUD接口.

  3. 在实现方法的主体中,我添加如下内容:

public function edit($params) {
    $this->params = $params;
    $this->CRUDHandler->handle("edit", $this);
}

(在PHP中,这可以使用__call()魔术方法完成.)

案例B

  1. 将类CRUDHandler定义为扩展基础DataExchangeService.

  2. 在定义特定类型的DataExchangeService(例如UsersExchangeService)而不是扩展DataExchangeService时,您可以扩展CRUDHandler,这样您就可以在需要时获得所需的一切.

那么,对于这种MultiInheritance方法还有其他意见吗?

谢谢

Nei*_*ell 7

目前有一种流行的思维方式,即" 赞成合成而非继承 ".谷歌上有太多关于真正列出这一切的信息,但我们只是说,除了偶尔的抽象基类之外,我还没有在2 - 3年内使用继承.

主要思想是任何给定的类,而不是扩展允许它提供所需功能的基类,将依赖于其他类.实际上,为了保持SOLID,它将依赖于接口,这些接口提供了一个表示它们将执行功能的合同.

然后,您将进入Controller类传入服务/组件的位置,它将委派给它以完成特定的作业.

请注意,你也可以走得太远.如果你有一个依赖于大量外部服务的类,特别是如果不是每个类的公共方法最终都使用它们,那么你可能实际上有两个类.即你的管理员通过做一个以上的工作"违反"单一责任原则.对于Web框架中的控制器来说,这很容易发生,因为它们会鼓励它.

在这一点上,我认为最好阅读: