我有两个类层次结构
A -> X -> Z
B -> Y -> Z
X,Y和Z是库函数,因此它们是不可更改的。
Z有一个函数 myfunc()
现在我想在A或B实例上调用 myfunc()时添加一些代码。
如何更改我的继承层次结构,我只需要实现一次附加代码?有什么模式吗?
答案 0 :(得分:3)
您可能应该将myfunc()的新实现分解为委托对象,并覆盖myfunc以指向委托。这是一个例子。
class MyFuncDelegate() {
static void myFunc() {
// your code
}
}
class A {
void myFunc() {
super.myFunc();
Delegate.myFunc();
}
}
然后,B可以使用相同的模式。不是面向对象,避免重复自己。
答案 1 :(得分:3)
使用委托来实现新功能。这不仅可以解决您的问题,还可以添加一些接缝进行测试。
class A extends X {
private ZDelegate delegate;
public A(ZDelegate delegate) {
this.delegate = delegate;
}
public R myFunc(P param) {
return delegate.myFunc(this, param);
}
}
public class ZDelegate {
public R myFunc(Z z, P param) {
//your code
z.myFunc(param);
//your code
//return something...
}
}
你有一个新的类(ZDelegate),它有一个明确的单一责任:增强myFunc。
测试的接缝是:您可以独立于其他所有测试新的myFunc。您可以独立于ZDelegate测试A和B对象。你可以用假货或模拟对象来做这两件事。
你的A和B物体仍然非常紧密地耦合到X,Y和Z虽然......