什么是拒绝遗赠?

cat*_*lla 11 duck-typing liskov-substitution-principle solid-principles

有人可以解释一下Refused Bequest的含义吗?我尝试阅读一些文章,并说它是一种代码气味,或者在wiki中它告诉它它是一个类,它覆盖基类的方法,使得基类的契约不受派生类的尊重.

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

rch*_*ria 20

我想你明白了.拒绝遗赠是一种代码气味.但是,什么类型的代码闻到了什么?引用Martin Fowler的书Refactoring:改进现有代码的设计:

子类可以继承父类的方法和数据.但是,如果他们不想要或不需要他们给予什么呢?他们获得了所有这些伟大的礼物,并挑选了几个.

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

更新回答@ catzilla的评论:

如果你没有机会阅读这本书(我完全推荐它),至少你有一个SourceMaking页面可以很好地描述它.

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

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

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

    public double getTax() {
        double tax = computeBaseTax();
        return addPersonalTax(tax);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

    @Override 
    public double getTax() {
        double tax = computeInitialTax();
        return addPersonalTax(tax);
    }
}
Run Code Online (Sandbox Code Playgroud)

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