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或更高版本。)
如果您发现这两种方法都不能很好地工作,那么您可以使用组合而不是继承(使用装饰器设计模式之类的东西)。
我需要使用一个界面:
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或更高版本。)
如果您发现这两种方法都不能很好地工作,那么您可以使用组合而不是继承(使用装饰器设计模式之类的东西)。