当前位置: 首页 > 知识库问答 >
问题:

与非必需方法的接口

诸葛嘉熙
2023-03-14

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

请对这个问题给予更多的理解和见解,并指出一个解决方案?例如,参见这个讨论:Java界面中的可选方法

在应用程序中,我使用连接到持久性(原则)的侦听器。所以我使用了以下几种方法:

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

等等。

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

然而,并不是所有人都需要所有的预。。。和后。。。方法。我需要确保他们有适当数量和类型的参数。在PHP中如何做到这一点?

共有3个答案

冯新知
2023-03-14

请看这里的例子:

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

娄嘉石
2023-03-14

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

类似的东西:

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
   }
}
钱承允
2023-03-14

不,接口的全部思想是有一个保证方法存在的契约。

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

 类似资料:
  • 问题内容: 我有一个定义方法的接口。我有一个 实现 此接口的结构。在其中,我已经从该接口实现了方法,并且还定义了其他方法。 例如: 在操场上:https : //play.golang.org/p/B1GgoNToNl_l 在此,WagTail()不是Animal接口的一部分,但属于Dog结构。运行此代码会出现错误 dog.WagTail未定义(动物类型没有字段或方法WagTail)。 有没有一种

  • 问题内容: 我开始学习Go,但对以下内容有所了解: 失败的原因是: 考虑到实现的事实,我不明白为什么Go不接受签名。有人可以帮忙解释吗? 问题答案: 我认为您对界面的理解不够充分。Interface {}本身就是一种类型。它由两部分组成:基础类型和基础值。 Golang没有重载。Golang类型系统按名称匹配,并且要求类型一致 因此,当您定义将接口类型作为参数的函数时: 这与采用int类型的函数不

  • 问题内容: Java-8允许在接口内部定义静态方法,但仅通过接口名称限制其调用: 9.4:接口可以声明静态方法,这些方法在不引用特定对象的情况下被调用。 例如: 导致错误: 在JLS中,这种禁令经常有一种解释。在这种情况下,我没有发现任何详细信息。因此,我正在寻找对此规则的全面或权威的解释:为什么禁止通过特定的对象引用调用静态方法?它有什么坏处? 问题答案: 相当强烈的共识是,有关类的静态方法也不

  • 我有一个任务,在那里我需要为“TotalCompetities”创建一个程序,它由多个“Competition”组成。我需要创建一个应用程序,允许用户做各种选项,与TotalCompetition相关。 如果选择了第一个选项(“创建一个新的竞争”),通过键入“1”然后按Enter,程序应该调用TotalCompetities类的addNewCompetition方法以添加一个具有给定名称的新竞争。

  • 一些程序使用固化的路径(hard-wired paths)指向一些目前还不存在的程序上。为了兼容这些程序,可以创建一些符号链接,然后在软件安装之后用实际文件进行替代。 ln -sv /tools/bin/{bash,cat,grep,pwd,stty} /bin ln -sv /tools/bin/perl /usr/bin ln -sv /tools/lib/libgcc_s.so{,.1} /

  • 我有一个控制器操作,它在Firefox本地和生产环境中都能正常工作,在IE本地工作,但在生产环境中不能正常工作。以下是我的控制器操作: 这是我在IE中得到的堆栈跟踪: 错误。处理您的请求时出错。系统。非静态方法需要一个目标。at系统。系统上的reflection . runtimemethodinfo . check consistency(对象目标)。reflection . runtimeme