与不需要的方法接口

时间:2015-01-11 18:58:44

标签: php interface

有没有办法在界面中指明可选方法(以便合同只显示要给出的参数的数量/类型)?

请对这个问题给予更多的理解和洞察,并指出解决方案?例如,请参阅此讨论:Optional Methods in Java Interface

在应用程序中,我使用连接到Persistence(Doctrine)的Listener。所以我使用了其中一些方法:

prePersist()
preUpdate()
postPersist()
postUpdate()

现在,在重构时,由于实体太多(要保留的对象),我决定将这些方法的各个部分拆分为不同的类。

然而,并非所有这些都需要所有pre -...和post -...方法。我需要确保给出适当数量和类型的参数。你是怎么用PHP做的?

5 个答案:

答案 0 :(得分:10)

没有。接口的整个想法是建立一个保证方法存在的契约。

但是一个类可以实现多个接口,因此您可以定义包含该方法的不同接口,而不是将该接口添加到没有该方法的类中。

答案 1 :(得分:2)

接口不能有可选方法。这就是界面背后的概念。如果你需要一些可选的东西,那么我建议你另外创建你的界面的默认实现,然后你需要的所有类都会扩展。这样,所有这些类都将实现接口,您也可以覆盖所选择的方法,具有可选行为。

类似的东西:

interface MyInterface {
  public function method1();
  public function method2();
}

然后Base类实现你的界面方法(我把它抽象为不允许直接使用):

abstract class Base implements MyInterface {
    public function method1() {
       // dummy
    }
    public function method2() {
       // dummy
    }
}

然后:

class Optional extends Base {
   // method1 is not overridden, so Base' implementation applies

   public function method2() {
     // something here
   }
}

答案 2 :(得分:2)

请参见此处的示例:

interface Workable
{
    public function work();
}

interface Feedable
{
    public function eat();
}

interface Employee extends Feedable, Workable
{
}

class Human implements Employee
{
    public function work()
    {
        // ....working
    }

    public function eat()
    {
        //.... eating in lunch break
    }
}

// robot can only work
class Robot implements Workable
{
    public function work()
    {
        // ....working
    }
}

来源:https://github.com/jupeter/clean-code-php

答案 3 :(得分:1)

我找到了一个介绍WeakInterfaces的有趣图书馆。但是我不认为让它与Doctrine一起工作很容易。

答案 4 :(得分:0)

在阅读了您的评论和互联网之后,我决定为应用程序设计选择另一种解决方法。

我创建了一个包含所有(必需和可选)方法的单一界面。将一定数量的接口相乘以实现简单的任务(特别是在上述情况下)我认为这是一种非常糟糕的方法。这是因为我认为类和接口的想法是将连接的东西保持在一起,而不是将它们分开并且#34;人为地"分开的#34;容器"。(例如,想想Java中的POPO / POJO中的POPO)。

现在,所有类都需要实现所有可能的方法,但是其中一些可能是空的,或者抛出异常,如上面给出的链接讨论中所示,或者GolezTrol在他的评论中。无论如何,感谢您的兴趣。