实现时的Java重复方法

问题描述 投票:0回答:2

我有一个我需要使用的接口:

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

然后我有多个实现这个的类

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

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

“go2”方法对于所有类都是相同的,并且复制它有点多余

所以它更好:

1)为所有这些类创建一个抽象并将“go2”放入其中?

要么

2)在每个类中创建“go2”并调用“super()”?

要么

3)什么更好?

java interface implements
2个回答
2
投票

为所有这些类创建一个抽象并将“go2”放入其中?

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

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

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


2
投票

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

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

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

但是,重要的是要注意,默认方法只能在调用其他接口方法的条件下实现。因此,如果该方法依赖于私有状态,那么您将需要创建一个抽象类并按照您的提及定义那里的行为,并在需要时让子类调用它。

© www.soinside.com 2019 - 2024. All rights reserved.