知识卡片
里氏替换只能正向使用不能反向要求
内容
[[里氏替换原则的两种定义]]是单向关系:父类能出现的地方子类必须能替换,子类出现的地方 父类未必胜任。狙击手依赖AUG狙击枪子类(需要zoomOut()),若强行用父类Rifle向下转型传入 AUG会抛ClassCastException。发散:调用方一旦依赖子类特有能力,就该直接声明依赖具体子类, 而非徒劳让父类兼容。
参考来源
- 位置:《设计模式之禅(第2版)》第2章《里氏替换原则》(源文件:_epub-src/text/part0009.html)
- 结论依据:原文用狙击手Snipper依赖AUG狙击枪(拥有zoomOut望远镜方法)为例,说明把父类Rifle强制向下转型为AUG传入会在运行期抛出ClassCastException,因此得出"有子类出现的地方父类未必就可以出现"的结论。
- 原始内容:显示是不行的,会在运行期抛出java.lang.ClassCastException异常,这也是大家经常说的向下转型(downcast)是不安全的,从里氏替换原则来看,就是有子类出现的地方父类未必就可以出现。