【问题标题】:Interface with not-required methods与非必需方法的接口
【发布时间】:2015-03-09 13:31:00
【问题描述】:

有没有办法在接口中指明可选方法(让合约只指明要给出的参数的数量/类型)?

请对问题提供更多的理解和洞察力,并指出解决方案?例如看这个讨论:Optional Methods in Java Interface

在应用程序中,我使用连接到持久性(学说)的侦听器。所以我正在使用其中一些方法:

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

等等

现在,在重构时,由于实体(要持久化的对象)太多,我决定将这些方法的各个部分拆分为单独的类。

但是,并非所有这些都需要所有 pre-... 和 post-... 方法。我需要确保为他们提供适当数量和类型的参数。你是如何在 PHP 中做到这一点的?

【问题讨论】:

  • @Marcin:不知道接口是什么完全可以。如果这个问题可以被批评(并且可以),那就是一些先前的研究/阅读可能已经得到证明,所以我们知道特别需要解释什么。
  • 嗯,刚刚发布了一个类似问题的答案,然后才看到这个问题。我认为对此处发布的答案进行了很好的总结,因此也许会有所帮助。 stackoverflow.com/a/66883322/1248282

标签: php interface


【解决方案1】:

请在此处查看示例:

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

【讨论】:

    【解决方案2】:

    我发现了一个有趣的库,介绍了WeakInterfaces。但是我认为让它与 Doctrine 一起工作并不容易。

    【讨论】:

      【解决方案3】:

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

      类似的东西:

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

      然后基类实现你接口的方法(我把它抽象成不允许直接使用):

      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
         }
      }
      

      【讨论】:

        【解决方案4】:

        在阅读了您的 cmets 以及互联网后,我决定为应用设计选择另一种解决方法。

        我创建了一个包含所有(必需和可选)方法的接口。增加接口数量来完成一个简单的任务(尤其是在提到的情况下)我认为这是一种非常糟糕的方法。这是因为我相信类和接口的想法是将连接的事物保持在一起,而不是“人为地”将它们拆分为单独的“容器”。(例如考虑 PHP / POJO 中的 POPO Java)。

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

        【讨论】:

        • 接口不应该被分割成“人工”容器,它们应该被“逻辑”分割。接口用于在应用程序中创建适当的逻辑抽象。是否选择实现一个或多个接口取决于实现类。
        【解决方案5】:

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

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

        【讨论】:

        • 查看我的更新。我不打算使用 pre- 和 post- 方法创建许多接口。这很荒谬,你不觉得吗? ;)
        • 不,我不这么认为,但另一种解决方案是只添加一个空的函数实现。您可以考虑在 Entity 基类中添加空实现,并仅在需要时覆盖这些实现。无论如何,如果接口声明了函数,则您必须具有实现。不过必须说,PHP 并没有那么严格,接口规则的(缺乏)强制执行是荒谬的。
        • 好的,谢谢你的建议。我决定在很大程度上采用提到的 Java 讨论方式,使用单一界面。
        猜你喜欢
        • 2012-03-25
        • 2019-01-08
        • 1970-01-01
        • 1970-01-01
        • 2015-11-24
        • 2013-07-21
        • 2018-06-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多