我有一个名为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 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
没有复制粘贴怎么做?
答案 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);
}
}
在这种情况下,DEa
和DEb
是逻辑提供者,DE
是状态提供者。现在,您可以向DE
注入任何类型的逻辑实现器并从中接收状态。