我需要使用一个界面:
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)什么更好??
答案 0 :(得分:2)
一种解决方案是使go2()
成为default方法:
public interface I {
void go1();
default void go2() { /* do logic*/}
}
因此,您可以在接口中封装go2
方法的通用逻辑,并让所有子类继承该行为。
但是,重要的是要注意,默认方法只能在对其他接口方法的调用方面实现。因此,如果该方法依赖于私有状态,那么您将需要创建一个抽象类并按照您的提及定义那里的行为,并在需要时让子类调用它。
答案 1 :(得分:2)
为所有这些类创建一个抽象并将“go2”放入其中?
是的,这是传统的方式,如果go2()
依赖于任何私有状态,它可能仍然是继承的唯一合理方式。即使使用Java 8和默认方法,您仍然无法在接口内使用任何私有状态。
如果方法不依赖于私有状态,则可以使用方法上的default
关键字直接在接口中声明方法体(假设您使用的是Java 8或更高版本。)
如果您发现这两种方法都不能很好地工作,那么您可以使用组合而不是继承(使用类似装饰器设计模式的东西。)