覆盖多个继承层次结构的函数

时间:2015-11-19 11:49:23

标签: java inheritance

我有两个类层次结构

A -> X -> Z
B -> Y -> Z

X,Y和Z是库函数,因此它们是不可更改的。

Z有一个函数 myfunc()

现在我想在A或B实例上调用 myfunc()时添加一些代码。

如何更改我的继承层次结构,我只需要实现一次附加代码?有什么模式吗?

2 个答案:

答案 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虽然......