Fir*_*cer 5 java inheritance interface multiple-inheritance
我正在使用Java API,这需要我实现许多相当大的接口。但是,通常在实现之间实际上只有一两个细节有所不同,因此我制作了一些抽象基类来提供大多数实现。
但是,现在我遇到了需要从其他一些类扩展和/或实现多个此类接口的情况,因此我无法扩展我的抽象基类。
在C ++中,我可以使用多重继承,还可以使用下面的其他技巧。但是,Java不允许多重继承,也不允许以这种方式使用泛型。
class MyClass : public HelperForInterfaceA, public HelperForInterfaceB {...};
class template<class BASE> MyHelper : public BASE {...};
Run Code Online (Sandbox Code Playgroud)
我现在最好的想法是将抽象帮助程序类的具体实现作为一个字段,然后将所有接口方法转发到该字段实例,而该字段引用了主要对象以实现最后的细节如果需要的话。
class MyClass extends A implements IB, IC {
private static class B extends BAbstractHelper {
private A a;
public B(A a, int size) {
super(size);
this.a = a;
}
@Override
public boolean foo(int x, int y) {
return a.foo(x, y);
}
}
private static class C extends CAbstractHelper {
...
}
private B b;
private C c;
private int range;
@Override
public boolean foo(int x, int y) {
return x*x + y*y <= range*range;
}
@Override
public float bar(float x, int y, String s) {
return b.bar(x,y,s);
}
...
}
Run Code Online (Sandbox Code Playgroud)
但是,这似乎有些痛苦,需要许多包装方法。有没有更好的方法来解决这个问题?
Java 的最佳实践是组合优于继承。使事情变得更简单,但会创建更多的样板代码。您有正确的想法来创建委托方法。一个好的 Java IDE 可以为您生成所有样板委托方法代码。JVM 上的其他语言(例如 Scala)(带有特征)使这变得更容易。
| 归档时间: |
|
| 查看次数: |
247 次 |
| 最近记录: |