组合优于继承

共 19 题
#

1. Decorator 模式作为组合的动态扩展(Java IO 流、JS HOC)

A 装饰器会改变被装饰对象的接口
B 装饰器必须继承多层子类
C 装饰器只能静态固定
D 装饰器通过组合动态叠加职责,不改变接口,是组合优于继承的体现 ✓ 正确答案
#

2. Effective Java 的"组合优于继承"原则;继承的破坏性(脆弱基类问题、菱形继承)

A 菱形继承无问题
B 继承总是优于组合
C 组合无法复用代码
D 继承泄漏基类封装,组合通过委托隔离变化,更安全 ✓ 正确答案
#

3. Fragile Base Class Problem(脆弱基类问题)中基类修改导致子类行为不可预期

A 脆弱基类问题只存在于 C++
B 基类修改不影响子类
C 基类内部实现变化可能导致子类行为不可预期,应用组合规避 ✓ 正确答案
D 组合无法避免脆弱基类问题
#

4. Mixin / Trait 模式作为"受限组合"(Ruby、Scala、Rust)

A 只能用于一个类
B 它们是强耦合的继承
C 它们横向复用行为而非建立深层继承层级,避免菱形歧义 ✓ 正确答案
D 与组合无关
#

5. State 模式作为组合的状态机替换

A 状态模式仍用 if-else 判断状态
B 上下文组合状态对象并委托行为,用多态替换 if-else 分支 ✓ 正确答案
C 状态模式增加状态耦合
D 状态模式与组合无关
#

6. 组合优于继承的例外场景中何时继承框架基类仍是唯一现实选择(如 ORM 实体、框架 Controller 基类),如何用工程规则约束其滥用边界?

A 业务代码之间应任意继承
B 继承永远可以用组合替代
C 框架强制继承(如 ORM 实体、Controller 基类)是合理例外,但应用规则约束滥用 ✓ 正确答案
D 例外场景无需任何约束
#

7. final class 的设计意图(不可继承)vs open class 的扩展空间

A final 类永远无法扩展
B final 冻结类型禁止继承,open 留出扩展空间,现代倾向默认 final ✓ 正确答案
C open 类更安全
D 默认都应 open
#

8. protected 字段/方法的耦合泄漏风险与替代(package-private、protected accessor)

A protected 与封装无关
B protected 字段完全安全
C 应尽量用 public 字段
D protected 直接暴露内部实现,应用 package-private 或 protected accessor 替代 ✓ 正确答案
#

9. 组合 vs 继承的对比中复用、扩展与脆弱性?

A 组合必然脆弱
B 继承更灵活
C 组合依赖接口、运行时可替换、更稳健,继承依赖内部实现易脆弱 ✓ 正确答案
D 两者脆弱性相同
#

10. 「组合的过度使用」反模式中仅为了复用而强行组合导致的对象图爆炸与间接调用链,何时应回归简单继承、接口默认方法或静态工具函数?

A 对象图越深越好
B 组合永远是正确选择
C 仅为复用而强行组合会导致对象图爆炸与间接调用链,应适时回归简单方式 ✓ 正确答案
D 静态工具函数无法复用
#

11. Template Method 模式中继承复用算法骨架的经典场景,与策略或组合方案相比的取舍与滥用边界?

A 基类定义骨架,子类实现可变步骤;骨架稳定时适用,多用策略/组合替换 ✓ 正确答案
B 模板方法用组合复用骨架
C 模板方法无滥用风险
D 模板方法与策略等价
#

12. 扩展第三方类时的继承覆写 vs 组合包装(Adapter/委托)中对升级兼容性与可测试性的影响如何取舍?

A 组合包装无法隔离第三方升级
B 继承覆写最安全
C 组合包装只依赖公开 API,升级兼容性与可测试性更好 ✓ 正确答案
D 继承不影响升级
#

13. 继承层级深度(≤3-4 层)的项目约束与可视化工具

A 无法可视化继承
B 继承深度越深越好
C 深继承无危害
D 用 DIT 指标监控继承深度,超限(如 >3-4 层)提示过度继承 ✓ 正确答案
#

14. 继承的陷阱中深层继承层次与菱形问题?

A 深层继承放大脆弱性,菱形多继承产生歧义,应尽量用组合规避 ✓ 正确答案
B 深层继承无问题
C 菱形问题只存在于 Java
D 继承深度越深越灵活
#

15. 组合的实现中委托与策略注入?

A 组合只能继承
B 组合通过委托复用能力、策略注入替换行为 ✓ 正确答案
C 委托与组合无关
D 策略注入只能在编译期
#

16. 何时继承仍合适,is-a 关系的确认?

A 继承永远不适用
B 只要语义叫 is-a 就可继承
C 继承合适需成立"行为可替换"的 is-a,且父类契约稳定 ✓ 正确答案
D is-a 与 LSP 无关
#

17. Mixin/接口默认方法的组合?

A 接口默认方法横向复用行为,类通过实现接口混入行为,避免继承层级 ✓ 正确答案
B 默认方法即继承
C 默认方法只能纵向
D 默认方法无法复用
#

18. 组合的运行时替换中策略的动态切换?

A 组合持有接口引用,运行时替换策略对象即可动态切换行为 ✓ 正确答案
B 继承可运行时替换
C 组合无法动态切换
D 策略模式与组合无关
#

19. 多重继承的语言机制差异中 C++ 多继承、Java 接口默认方法与 Ruby mixin 各自的问题与组合替代?

A C++ 用虚继承、Java 用接口默认覆写、Ruby 用线性化解冲突,组合委托可避免冲突 ✓ 正确答案
B 三种语言机制完全相同
C 多继承无冲突
D 组合无法替代多继承