如何解决实现多个接口时,尽量减少代码重复
| 我有一个主接口和一个抽象类,实现了它的所有“可派生”方法(只能使用抽象方法编写):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
实现所有\“ derivable \”方法(例如Main
中的main2
)。问题是我可能想同时实现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);
}
}
当然,这仅在层次结构相当稳定的情况下才有意义(这意味着子接口之前就已经知道),但是对我来说就是这种情况。看到多余的方法也不是一件好事,但是我看不出有办法改变它。
解决方法
将工作外部化到实用程序类,构建器等。
,
我想知道在这种情况下是否有一个很好的方法来减少代码重复。
我相信标准答案将是使用对象组合。
相关问题:
在具有现有类的情况下,接口如何代替对多重继承的需求(请参阅第一个对象对象构成示例的答案。)
Java中的多重继承的替代方法
如何在Java中实现多重继承
Java中的多继承设计问题
, 使用objweb asm字节码库,您可以编写一个实用程序,该实用程序从所有方法以及所有实现类的字段中读取代码,并将它们放入一个类中。
该工具看起来像这样
公共类ClassUtil {
public static Class<?> unifyClass(Class<?>...classes) {
return ...;
}
}
And then
Class<?> subAllClass = unifyClass(SubA.class,SubB.class,...);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。