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就会发生代码异味.