Java:处理多个复杂接口而无需重复代码

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)

但是,这似乎有些痛苦,需要许多包装方法。有没有更好的方法来解决这个问题?

nei*_*ldo 1

Java 的最佳实践是组合优于继承。使事情变得更简单,但会创建更多的样板代码。您有正确的想法来创建委托方法。一个好的 Java IDE 可以为您生成所有样板委托方法代码。JVM 上的其他语言(例如 Scala)(带有特征)使这变得更容易。