知识卡片

子类无法完整实现父类方法应断开继承

普通读书笔记卡 · 1983.a.1

内容

[[里氏替换原则的两种定义]]第一层含义:子类必须完全实现父类方法。玩具枪继承抽象枪类后 shoot()无法真正实现”射击”语义,只能空实现——士兵持玩具枪调用killEnemy()会静默失败, 比抛异常更危险。解法不是加instanceof特判,而是断开继承,改用关联/委托复用外观数据。 发散:方法名签名相同不等于语义相同,继承检查的是行为契约而非接口能否编译。

参考来源

- 位置:《设计模式之禅(第2版)》第2章《里氏替换原则》(源文件:_epub-src/text/part0009.html) - 结论依据:原文用玩具枪继承AbstractGun却无法实现shoot()语义为例,展示士兵持玩具枪"杀敌"却不报错的隐性错误,并给出"断开父子继承关系,采用依赖、聚集、组合等关系代替继承"的解决方案。 - 原始内容:如果子类不能完整地实现父类的方法,或者父类的某些方法在子类中已经发生"畸变",则建议断开父子继承关系,采用依赖、聚集、组合等关系代替继承。