什么是拒绝遗赠?

What is a Refused Bequest?

有人可以解释一下 Refused Bequest 是什么意思吗? 我尝试阅读一些文章并说它有一种代码味道,或者在 wiki 中它告诉我它是一个 class 以这样一种方式覆盖基 class 的方法,即基 class 的契约 class 不被派生的 class 接受。

但简而言之,或者更简单地说,它实际上是什么?

我想你明白了。 Refused Bequest 是一种代码味道。但是,什么类型的代码有味道?引用 Martin Fowler 的书 Refactoring: improving the design of existing code:

Subclasses get to inherit the methods and data of their parents. But what if they don't want or need what they are given? They are given all these great gifts and pick just a few to play with.

您有一个从父 class 继承的子class,但是子class 不需要父class 提供的所有行为。因此,子class 拒绝父class的某些行为(遗赠)。这就是为什么这是代码味道。

更新回答@catzilla 的评论

如果你没有机会阅读这本书(我完全推荐它),至少你有 SourceMaking page 描述得很好。

关于代码示例,我们来试试。假设我们有一些 classes 来计算一个人的税收。我们可以有一个 class 来计算政府税收:

class Government {
    protected double computeBaseTax() { //... }

    protected double addPersonalTax(double tax) { //... }

    public double getTax() {
        double tax = computeBaseTax();
        return addPersonalTax(tax);
    }
}

然后,我们可以有一个 class 来计算公司必须缴纳的税款金额。无论出于何种原因,我们意识到 class 可以重用 addPersonalTax 方法,但不能重用 computeBaseTax()。做出了一个错误的决定,我们决定 Company class 将继承自 Government.

class Company extends Government {
    private double computeInitialTax() { //... }

    @Override 
    public double getTax() {
        double tax = computeInitialTax();
        return addPersonalTax(tax);
    }
}

好的,问题可以用更好的方式解决(覆盖 computeBaseTax() 方法),但我试图说明 Refused Bequest 是一种代码味道当我们从基础 class 继承并且提供的某些功能被拒绝时会发生。