拒绝遗赠
概述
拒绝遗赠是面向对象滥用类代码异味的一种,指子类没有充分利用继承来的属性和方法,或者重写了父类方法只是为了避免执行原方法,这表明继承关系设计不当。
关键内容
- 特征识别:
- 子类没有使用继承来的某些方法或数据
- 子类重写父类方法只是为了不执行原有逻辑
- 继承被当作代码复用手段,而非真正的IS-A关系
-
子类中出现空的重写方法
-
负面影响:
- 抽象层次不当
- 违反里氏替换原则
- 继承层次具有误导性
- 造成不必要的复杂性
-
破坏了继承的语义意义
-
重构策略:
- Push Down Method:将方法下推到实际使用的子类
- Push Down Field:将字段下推到实际使用的子类
- Replace Subclass with Delegate:用委托代替继承
-
Replace Inheritance with Delegation:用组合替代继承
-
根本原因:
- 过早抽象,在真正需要之前就建立了继承层次
- 错误地将"has-a"关系建模为"is-a"关系
- 为了代码复用而滥用继承
来源
- Martin Fowler — 《重构:改善既有代码的设计》
- 代码异味 — 重构指导书