使用抽象类实现接口

时间:2015-07-16 11:51:50

标签: java oop interface

我有一个界面。为了这个问题,我会简化它:

interface EraseableColoredPencil {

  //This method seems appropriate for an interface;
  //The implementation will change with each class that implements this interface.
  void draw();

  //This method does not seem as appropriate;
  //The implementation of the erase method would be the same for all classes.
  void erase();
}

我的问题是:根据OOP原则,表达此内容的最佳方式是什么?两种方法的界面似乎都不合适。以下是我提出的选项:

  1. 在接口上列出所有方法,无论实现是否相同。然后使用抽象类进行共享erase()实现。这似乎是我的最佳解决方案,因为EraseableColoredPencil需要实现erase(),这允许所有类共享相同的实施。我知道这是可能的,但我关心的是它是否遵循最佳实践。
  2. 消除界面并使用抽象类。这似乎不符合良好的设计模式,但可以保证每个扩展类都具有适当的方法,甚至在给定的情况下具有一致的实现方法被覆盖。
  3. 保持原样。我可能会过度思考这一点,这真的是一种可行的方式。
  4. 其他东西。我确定我错过了什么。有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

  1. 其他内容:关注Interface Segregation Principle并拆分界面:

    interface Drawer{
      void draw();
    }
    
    interface Erasable {
      void erase();
    }
    
    interface EraseableDrawer extends Drawer, Erasable {
    }
    

    现在您只需要依赖DrawerErasable,具体取决于您真正需要的方法(如果您需要,可以ErasableDrawer)。

    如果erase()对于所有或大多数类实际上是相同的实现,您仍然可以使用实现AbstractErasableDrawer的抽象类ErasableDrawer,具体实现erase()(或使用默认实现as suggested above

答案 1 :(得分:1)

正如您现在刚才询问的那样,Java 8提供了第三种选择:{{3}}。

这允许您使用接口并定义erase的默认行为,从而无需抽象类:

interface EraseableColoredPencil {

    void draw();

    default void erase() { ... }
}