我需要对Java中的以下问题的设计模式提出一些有用的建议。
我有三个班级:
class A extends X implement Y {
doA()
}
class B extends X implement Y {
doB()
}
class C extends X implement Y {
doC()
}
现在我想创建一个类D
,它应该重用类doA
,doB
的方法doC
,A
和B
以及分别为C
。
有人可以为上述问题提出设计建议吗?
答案 0 :(得分:4)
我认为你需要使用范例" Prefer composition over inheritance"。设计类D
,其中包含A
,B
,C
的实例,并根据需要调用其方法。此外,D
可以在必要时实施Y
,并将相应的API调用委托给A
或B
或C
。
答案 1 :(得分:1)
这不是直接可行的。
如果您的设计允许,最好的选择是重新创建X
作为接口,其他作为扩展X
的接口。这将允许D
实施所有其他。
如果做不到这一点,您可能会({1}}拥有D
,A
和B
的私有实例,这取决于您尝试做的事情,然后让它将你提到的方法委托给那些实例。但请记住,如果您这样做,您将有三个不同的C
个实例。
正确的答案可能是您的类层次结构已经不是它应该是的了!但问题还不够确定。
答案 2 :(得分:1)
您可以尝试这样的事情:
class A extends X implement Y{
doA()
}
class B extends X implement Y{
doB()
}
class C extends X implement Y{
doC()
}
interface Delegator {
doSomething();
}
class DBuider {
public DBuider with(Delegator d) {
// create chain and store it
return this;
}
Chain build() {
// return new D with resulted chain
}
class Chain {
Delegator del;
Chain next;
}
}
class D implements Y {
Chain c;
static DBuilder create() {
return new DBuilder();
}
doD() {
Chain t = c;
while (t != null) {
t.del.doSomething();
t = t.next;
}
}
}
----- Usage -----
D.create().with(() -> new A().doA()).with(() -> new B().doB()).build().doD();
答案 3 :(得分:0)
您可以从现有的课程中撰写新的课程D:
class D {
private A a = new A();
private B b = new B();
private C c = new C();
public void foo() {
this.a.doA();
this.b.doB();
this.c.doC();
}
}
答案 4 :(得分:0)
在不知道所有细节的情况下,这感觉就像是一个构图问题。
Class D
{
private A _a = new A();
private B _b = new B();
private C _c = new C();
doA()
{
_a.doA();
}
doB()
{
_b.doB();
}
doC()
{
_c.doC();
}
}
根据您的目的,这可能是也可能不合适。