繁体   English   中英

具有存根方法的接口的默认实现应该抽象吗?

[英]Should a default implementation of an interface with stub methods be abstract?

假设我有一个界面

interface MyInterface {
  void doSomething();
  void doSomethingElse();
  /* way more methods */
}

可能是这样的默认实现:

class StubbedMyInterface implements MyInterace {
  void doSomething() {
    throw new UnsupportedOperationException();
  }

  void doSomethingElse() {
    throw new UnsupportedOperationException();
  }
  /* all the other methods */
}

存根类仅存在,因此接口的实现者不需要实现他们不关心的所有方法。

应该将StubbedMyInterface类声明为抽象类吗? 还是应该具有受保护的默认构造函数(例如,对StubbedMyInterface进行的单元测试(该方法可以检查所有方法均抛出所需的异常)可以实例化该类而不创建不必要的子类)? 还是应该只是普通的公开课?

更新:好的,我看到我应该提供更多的上下文。 实现抽象语法树的访客模式时,会发生此问题。 接口在树中为每种节点类型定义一种方法,并且这些方法有很多类型。

我有几个这样的Stub实现:

  1. 类似于上面的一个,例如在处理某个节点的子节点时很有用-在这种情况下,我知道只有节点类型A,B和C可能是我处理其子节点的节点的子节点。 而且,如果我错了,我想要一些错误消息以指出问题所在。
  2. 一个只对每个方法都有空的实现-如果我只想处理我知道该怎么做的节点而忽略其他节点,则这很有用。
  3. 默认情况下,它遍历每个节点的子节点,这对于我要遍历完整树但仅关心某些节点类型的情况很有用。

对我来说,这取决于布赫。 “一堂课应该简单而完整。” 这堂课完了吗? 如果不是,则应该是抽象的。

该结构的性质并不引人注目。 此类本身是否对某些事情有用是关键因素。 如果不是,则应该是抽象的。

如果某些接口方法定义不应该实现,那么我宁愿将它们分布在多个接口上。

然后,我将仅实现确切的接口,其中包含我感兴趣的方法定义。

例如:

interface MyFirstInterface {
    void doSomething();
}

interface MySecondInterface {
    void doSomethingElse();
}

public class MyClass implement MySecondInterface {
    void doSomethingElse() {

    }
}

使用Java 8,您可以在接口本身中定义默认的实现,这比抽象类(您可以继承多个接口)提供更大的灵活性-因此它看起来像:

interface MyInterface {
  default void doSomething() {
    throw new UnsupportedOperationException();
  }

  default void doSomethingElse() {
    throw new UnsupportedOperationException();
  }
  /* all the other methods */
}

在Java 7和更早版本中,使用抽象类提供默认的基本实现是有意义的。

如果该接口的实现者不需要实现所有方法,则他们不需要实现此接口,那么他们只需要在层次结构中具有所需方法集的一个接口即可。 我会这样使用继承

interface MyFirstInterface {
    void doSomething();
}
interface MySecondInterface extends MyFirstInterface {
    void doSomethingElse();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM