子类仅重写父类一个方法是否属于Refused Parent Bequest代码异味?
咱们先回到Martin Fowler对**Refused Parent Bequest(拒绝继承遗赠)**的核心定义:子类继承了父类的方法与数据,但子类并不需要或不想要这些继承内容,仅选用其中少数部分使用。针对你提到的BinaryChop extends ColumnFixture且仅重写一个方法的情况,不能直接一刀切,得结合实际使用场景判断:
情况1:属于代码异味的场景
如果BinaryChop只是为了利用ColumnFixture的某一个小功能(比如FitNesse里自动把表格列映射到类字段的特性),而完全忽略父类提供的其他绝大多数方法和逻辑——比如父类用于测试执行流程、结果展示、列处理的核心方法,子类根本用不上甚至要刻意避开,那这就完全符合Refused Parent Bequest的定义。
这种情况下,继承就成了“为了一个小功能硬扛一堆不需要的代码”,不仅会让子类的职责模糊,还会带来不必要的依赖。这时候的重构建议是:用组合替代继承,比如把ColumnFixture作为BinaryChop的成员变量,只调用需要的方法;或者看看有没有更轻量化的接口/基类可以复用,避免继承冗余的内容。
情况2:不属于代码异味的场景
如果BinaryChop除了重写execute方法,还在依赖ColumnFixture的核心功能——比如用父类来处理测试结果的输出、表格列的校验、测试上下文的管理等,那它本质上是在扩展父类的能力,而不是拒绝大部分继承的内容。这时候继承是合理的,子类只是根据自己的业务逻辑(二分查找)重写了核心执行方法,完全符合继承的“is-a”关系,不属于代码异味。
简单来说,判断的核心是:子类到底是“被迫继承了一堆没用的东西,只挑一点用”,还是“基于父类的基础能力,扩展出自己的功能”。
内容的提问来源于stack exchange,提问作者Ilyas

