有人可以解释拒绝遗赠是什么意思吗?我尝试阅读一些文章并说它是一种代码气味,或者在 wiki 中它告诉它是一个覆盖基类方法的类,其方式是派生类不遵守基类的合同。
但简而言之,或更简单的说法,它实际上是什么?
有人可以解释拒绝遗赠是什么意思吗?我尝试阅读一些文章并说它是一种代码气味,或者在 wiki 中它告诉它是一个覆盖基类方法的类,其方式是派生类不遵守基类的合同。
但简而言之,或更简单的说法,它实际上是什么?
我想你明白了。拒绝遗赠是一种代码味道。但是,什么类型的代码有异味?引用 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是当我们从基类继承并且提供的某些功能被拒绝时发生的代码异味。