我有一个名为DE的基本算法。它有2种实现的方法:a()b()。我想测试此算法的变体,名为DEa。因此,我正在做DEa extends DE,并且我重写了方法a()。还有另一个变体,算法DEb。我正在做同样的事情,DEb extends DE并覆盖b()。现在,我要测试算法DEab。这是问题所在。如果我写DEab extends DEa,它将已经覆盖了方法a(),但没有覆盖b(),我将不得不从b()复制DEb,这很丑陋且难以维护。

代码示例:

class DE { int i; void a() { i = 1; } void b() { i++; } };
class DEa extends DE { void a() { i = 2; } };
class DEb extends DE { void b() { i--; } };
// class DEab extends DEa, DEb - can't write like this
class DEab extends DEa { void b() { i-- }; } // but this is copy-paste :c


我尝试使用interface Ainterface B和更高版本的DE implements A, BDEa extends DEDEb extends DE ...,这基本上是相同的问题:

interface A { void a(); } // methods in interfaces must be abstract
interface B { void b(); }
class DE implements A, B { int i; void a() { i = 1; } void b() { i++; } };
class DEa extends DE { void a() { i = 2; } };
class DEb extends DE { void b() { i--; } };
class DEab extends // ... well it give me nothing


没有复制粘贴怎么办?

最佳答案

您可以使用此模式。

public interface A {
    public void a();
}

public interface B {
    public void b();
}

public class ABComposition implements A, B {
    private A a;
    private B b;

    public ABComposition(A a, B b) {
        this.a = a;
        this.b = b;
    }

    @Override
    public void a() {
        a.a();
    }

    @Override
    public void b() {
        b.b();
    }
}

关于java - 多重继承,组合功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17121538/

10-11 20:32