1

我有一个名为DE. 它有 2 个实现的方法:a(), b(). 我想测试这个算法的一个变体,命名为DEa. 所以,我正在做DEa extends DE并且我覆盖了 method a()。还有另一种变体, algorithm DEb。我也在做同样的事情,DEb extends DE并且覆盖b(). 现在,我想测试 algorithm DEab。这是问题所在。如果我写DEab extends DEa它已经有覆盖的方法a(),但没有b(),我将不得不复制b()from 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 A,interface B后来DE implements A, B, DEa extends DE, DEb 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

没有复制粘贴怎么办?

4

3 回答 3

3

您可以使用此模式。

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();
    }
}
于 2013-06-15T08:17:22.490 回答
2

Java中没有多重继承。您只能实现多个接口(您提供实现),但只能实现一个(直接)超类。

无论如何,您都可以使用合成,通过制作

 public class DEab extends DE {
   private DEa dea = new DEa();
   private DEb deb = new DEb();
   public int a() {
     return dea.a();
   }

   public int b() {
     return deb.b();
   }
 }

如果您的班级的逻辑支持它。

更新:问题更新后,我坚持使用更简单的“不,Java 不支持多重继承”

于 2013-06-15T08:17:30.910 回答
0

在您对共享状态假设发表评论后,我可以建议您重构 @Toilal 方法的版本:

interface A {
    public int a();
}

interface B {
    public int b(int i);
}

class DEa implements A {
    @Override
    public int a() {
        return 1;
    }
}

class DEb implements B {
    @Override
    public int b(int i) {
        return i + 1;
    }
}

class DE {
    private int i;
    private A a;
    private B b;

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

    public int getI() {
        return i;
    }

    public void a() {
        i = a.a();
    }

    public void b() {
        i = b.b(i);
    }
}

在这种情况下DEa,andDEb是逻辑提供者,并且DE是状态提供者。现在您可以向其中注入任何类型的逻辑实现者DE并从中接收状态。

于 2013-06-15T10:00:54.650 回答