Java 实现时复制方法

Java duplicate method when implement

我需要使用一个界面:

public interface I {  
      void go1();    
      void go2(); 
}

然后我有多个 classes 实现这个

public class A implements I {
    @Override  void go1() { ... }   
    @Override  void go2() { ... } 
}

public class B implements I {
   @Override   void go1() { ... }   
   @Override   void go2() { ... } 
}

"go2" 方法对所有 class 都是相同的,复制它有点多余

那么最好是:

1) 为所有这些 classes 创建一个摘要并将 "go2" 放在里面?

2) 在每个 class 中创建 "go2" 并调用 "super()"?

3) 有什么更好的吗??

一个解决方案是使 go2() 成为一个 default 方法:

public interface I { 
    void go1(); 
    default void go2() { /* do logic*/}
}

因此您可以在接口中封装 go2 方法的通用逻辑,并让所有子class 继承该行为。

但是需要注意的是,默认方法只能在调用其他接口方法的情况下实现。因此,如果该方法依赖于私有状态,那么您需要创建一个抽象 class 并在那里定义行为,如您所提到的,并在需要时让 subclasses 调用它。

create an abstract for all these classes and put "go2" inside?

是的,这是传统方式,如果 go2() 依赖于任何私有状态,那么通过继承可能仍然是唯一明智的方式。即使使用 Java 8 和默认方法,您仍然不能在接口内使用任何私有状态。

如果该方法不依赖于私有状态,您可以通过在方法上使用 default 关键字直接在接口中声明方法主体(假设您使用的是 Java 8或更高版本。)

如果您发现这两种方法都不能很好地工作,那么您可以使用组合而不是继承(使用装饰器设计模式之类的东西)。