没有多重继承怎么解决这个问题?

时间:2011-10-09 15:08:45

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

我的课程名为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

控制器,模板和权限就是例如。

3 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:3)

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

  

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

特征在PHP 5.4中提供,在Scala中很常见。

答案 2 :(得分:3)

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