我有一个主界面和一个实现所有“可派生”方法(可以只使用抽象方法编写)的抽象类:
public interface Main {
public void main1(int x);
public void main2();
}
public abstract class MainAbstract implements Main {
public void main2() { main1(42); }
}
此功能可以在不同的“方向”扩展:
public interface SubA extends Main {
public void subA1(int x);
public void subA2();
}
public interface SubB extends Main {
public void subB1(int x);
public void subB2();
}
现在我可以使用抽象类SubAAbstract
和SubBAbstract
来实现所有“可派生”方法(例如main2
中的Main
)。问题是我可能有具体实现想要同时实现SubA
和 SubB
,所以我只能使用其中一个抽象类。实际上问题更严重,因为我有两个以上的子接口。
我知道Java中没有单一继承的方法,但我想知道在这种情况下是否有一种很好的方法可以最大限度地减少代码重复。
[编辑]
将所有功能放在MainAbstract类中是否令人憎恶(请注意它只实现Main),例如。
public abstract class MainAbstract implements Main {
public void main2() {
main1(42);
}
public void subA1(int x) {
throw new UnsupportedOperationException("Not supported yet.");
}
public void subA2() {
subA1(4711);
}
public void subB1(int x) {
throw new UnsupportedOperationException("Not supported yet.");
}
public void subB2() {
subB1(-1);
}
}
然后,具体类只需要实现所需的接口,并实现所需的方法:
public class MainConcrete extends MainAbstract implements Main, SubA {
public void main1(int x) {
System.out.println("main " + x);
}
public void subA1(int x) {
System.out.println("subA" + x);
}
}
当然,只有层次结构相当稳定(这意味着子接口之前就已知),这才有意义,但对我来说就是这种情况。让多余的方法可见也不好,但我没有办法改变它。
答案 0 :(得分:2)
答案 1 :(得分:0)
将工作外部化到实用程序类,构建器等。
答案 2 :(得分:0)
使用objweb asm字节码库,你可以编写一个实用程序来读取所有方法的代码,以及所有实现类的字段,并将它们放入一个类中。
util会看起来像这样 公共类ClassUtil {
public static Class<?> unifyClass(Class<?>...classes) {
return ...;
}
}
And then
Class<?> subAllClass = unifyClass(SubA.class, SubB.class, ...);