【问题标题】:Java: Dealing with multiple complex interfaces without duplicate codeJava:无需重复代码即可处理多个复杂接口
【发布时间】:2014-03-01 08:28:18
【问题描述】:

我正在使用 Java API,它需要我实现一些相当大的接口。但是通常只有一两个细节在实现之间实际上有所不同,因此我制作了一些抽象基类来提供大部分实现。

但是现在我遇到了需要从其他类扩展和/或实现多个此类接口的情况,因此我无法扩展我的抽象基类。

在 C++ 中,我可以使用多重继承,还可以使用一些其他技巧,如下所示。但是 Java 不允许以这种方式使用多重继承或泛型。

class MyClass : public HelperForInterfaceA, public HelperForInterfaceB {...};
class template<class BASE> MyHelper : public BASE {...};

我现在最好的想法是将我的抽象助手类的具体实现作为一个字段,然后将所有接口方法转发到该字段实例,该字段具有对要实现的主要对象的引用如果需要,最后的详细信息。

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);
    }

    ...
}

但这似乎有点麻烦,需要很多包装器方法。有没有更好的处理方法?

【问题讨论】:

  • 非常好的问题。恐怕会很痛:-(

标签: java inheritance interface multiple-inheritance


【解决方案1】:

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

【讨论】:

  • 另一方面,我认为人们将组合视为对“偏好组合胜过继承”趋势的反应。这可能是这个人面对充满困难接口的代码的原因。如果你非常仔细地考虑你的类结构,那么继承通常是一个很好的解决方案。我很少需要使用组合,因为几乎所有东西都可以使用继承很好地表示。听起来像是异端邪说,但创始人对继承如此兴奋是有原因的。这是一个非常有用的结构化工具。
  • 现在 Java 支持接口中的默认方法实现,这更容易通过多个接口实现,而无需创建委托方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-10
  • 2017-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多