多重继承,组合功能

时间:2013-06-15 08:11:45

标签: java oop design-patterns

我有一个名为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

没有复制粘贴怎么做?

3 个答案:

答案 0 :(得分: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();
    }
}

答案 1 :(得分: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不支持多重继承”

答案 2 :(得分: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);
    }
}

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