何时扩展接口或使用多个接口或使用接口扩展类

时间:2018-03-27 18:19:59

标签: php oop interface

在阅读http://php.net/manual/en/language.oop5.interfaces.php之后,我不确定何时应该扩展接口或使用多个接口或使用接口扩展类。用什么标准来确定采取哪种方法?

<?php
interface Interface_A
{
    public function aaa();
}

interface Interface_B
{
    public function bbb();
}

interface Interface_C extends Interface_A
{
    public function bbb();
}

class Class_A implements Interface_A, Interface_B
{
    public function aaa(){}
    public function bbb(){}
}

class Class_B implements Interface_C
{
    public function aaa(){}
    public function bbb(){}
}

class Class_C implements Interface_A
{
    public function aaa(){}
}

class Class_D extends Class_C implements Interface_B
{
    //public function aaa(){}  //Use parent
    public function bbb(){}
}

1 个答案:

答案 0 :(得分:1)

我认为,一个好的方法是默认关注Composition over inheritanceInterface segregation principle。对于大多数情况,这会自动排除 &#34;扩展接口&#34; &#34;使用接口&#34; 扩展类。对于其余的情况,一如既往,取决于。

接口是契约,因此当类实现接口时,它会显示其具有适当方法的其他类。这为Liskov substitution principle提供了基础。

从您的示例:

  1. 如果您的某些课程依赖于aaa()方法,而您的某些课程依赖于aaa()bbb()方法,而且没有一个课程仅依靠bbb()事实上,你可以扩展Interface_A,从而将方法添加到它。

  2. 如果之前的所有课程都保留,但有些课程还单独依赖bbb(),那么最好有Interface_AInterface_B。如果你想用一个接口强制执行这两个方法,你可以创建组合的一个:

    interface Interface_C扩展了Interface_A,Interface_B {

    }

  3. 这是我的主观意见,但是从理解的角度来看,扩展类和实现界面有点复杂,并没有真正有用(或者我说不是很实用)。通常,您实现了一个接口,以便您可以键入提示。如果您键入提示Interface_B并且您的Class_D实现了它,那么您不应该关心此类是否实现任何其他接口。这意味着,您可以将Class_C作为Class_D的依赖项,并且可以完全避免使用继承。