14

有人可以解释拒绝遗赠是什么意思吗?我尝试阅读一些文章并说它是一种代码气味,或者在 wiki 中它告诉它是一个覆盖基类方法的类,其方式是派生类不遵守基类的合同。

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

4

1 回答 1

22

我想你明白了。拒绝遗赠是一种代码味道。但是,什么类型的代码有异味?引用 Martin Fowler 的书重构:改进现有代码的设计

子类可以继承父类的方法和数据。但是,如果他们不想要或不需要他们得到的东西怎么办?他们得到了所有这些很棒的礼物,并且只挑选了一些来玩。

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

更新回答@catzilla 的评论

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

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

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

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

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

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

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

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

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

于 2015-03-11T15:39:21.547 回答