【问题标题】:When to extend interfaces or use multiple interfaces or extend classes with interfaces何时扩展接口或使用多个接口或使用接口扩展类
【发布时间】:2018-03-27 18:19:58
【问题描述】:

看了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(){}
}

【问题讨论】:

  • 没有单一的标准。您需要对现有模式进行研究,然后选择一种或提出自己的设计。
  • @yivi 感谢您的评论。虽然我看到了为什么使用现有接口扩展类可能比其他解决方案有利或不利的原因,但我认为扩展接口与使用多个接口之间没有区别。您是否遇到过任何描述使用一种方法而不是另一种方法的策略的教程?

标签: php oop interface


【解决方案1】:

我认为,一种好的方法是默认遵循Composition over inheritanceInterface segregation principle。在大多数情况下,这会自动排除“扩展接口”“使用接口扩展类”。对于其余情况,一如既往,视情况而定。

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

从你的例子中:

    1234563可以扩展Interface_A,从而将方法添加到其中。
  1. 如果之前的所有保留,但某些类还单独依赖bbb(),那么最好有Interface_AInterface_B。如果你想用一个接口强制执行这两种方法,你可以创建一个组合的接口:

    接口 Interface_C 扩展了 Interface_A、Interface_B {

    }

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-19
    • 2011-12-13
    相关资源
    最近更新 更多