应优先用组合替代深层继承,拆分职责引入策略模式,或使用Mixin扁平化复用,同时清理无实质作用的中间抽象层。

继承层次过深会显著降低代码可读性、增加维护成本,并容易引发“脆弱基类”问题——父类一处修改,可能意外破坏多个子类行为。重构的关键不是删掉继承,而是用更稳定、更可控的方式组织关系。
优先用组合替代深层继承
当类层级超过三层(如 A ← B ← C ← D),应审视是否真需要“is-a”语义。多数场景实际表达的是“has-a”或“uses-a”。
- 把原本靠继承传递的行为,抽成独立类,通过属性注入到主类中
- 例如:原结构 Vehicle ← Car ← ElectricCar ← TeslaModel3,可改为 TeslaModel3 持有 Battery、Motor、Autopilot 等组件实例
- 组件之间低耦合,可单独测试、替换或复用,不再受继承链牵连
拆分职责,引入策略或模板模式
深层继承常因“不同子类只改一小部分逻辑”而堆叠出来。此时更适合将变化点抽象为可插拔的策略。
- 把原继承链中反复重写的几个方法(如
calculate_tax()、validate_order())提取为接口或函数参数 - 主类保留统一骨架,具体逻辑由外部传入的策略对象执行
- 避免新增子类,只需新增策略类,符合开闭原则
扁平化为多继承 + Mixin 类
若确实需复用多个能力,与其拉长单继承链,不如用清晰命名的 Mixin 类横向组合。
- 每个 Mixin 封装一个正交能力(如
SerializableMixin、CacheableMixin、LoggableMixin) - 目标类直接继承
BaseClass, SerializableMixin, CacheableMixin,无深度嵌套 - Mixin 中避免定义
__init__,或严格使用super().__init__()配合 MRO 协作
检查并清理中间抽象层
有些中间类(如 AbstractVehicleV2、BaseCarImpl)并无实际业务含义,仅为“方便以后扩展”而存在,实则成了冗余胶水。
- 逐个审查每层类:它是否定义了非空方法?是否被两个以上子类共用?是否有明确的业务概念?
- 若某层仅含空方法或纯文档作用,考虑合并到上层或删除
- 用
grep -r "class.*:"和git log -S "class.*"辅助识别长期未变的“僵尸类”

















