首页/开发/代码质量与评审速查/手法:Replace Superclass with Delegate(以委托替换继承)
重构手法62 条

手法:Replace Superclass with Delegate(以委托替换继承)

子类关系只为复用父类实现而建立时,改为持有父类实例并转发需要的能力:类型语义不再被伪造,继承带来的多余接口消失;组合优先的具体应用。

信号继承只图代码复用、部分父类方法不适用
做法持有父类实例 + 定向转发
收益暴露面收窄,替换实现更自由

Java 示例

Java 示例
// 之前
class Stack extends Vector { ... }

// 之后
class Stack {
    private final Deque<Object> elements = new ArrayDeque<>();
    void push(Object o) { elements.push(o); }
}

易错点

  • 转发时把父类全部公开方法照搬:白名单式转发更稳妥
  • 遗漏父类隐含契约(equals/hashCode):行为可能改变

数据来源与参考

  • 《重构》第 2 版 · 第 12 章(Replace Superclass with Delegate)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌