题库系统集成项目管理工程师

系统集成项目管理工程师 · 第三版 · 第5章 软件工程

子类新增使用前提,还能安全替换父类吗?

12 道章节练习题
单选题5.3 软件设计12 / 12

父类TextExporter约定可导出任意非空纯文本。子类保持相同方法签名,却新增“文本必须含XML标签”的前提,并拒绝普通文本。关于这一设计,判断正确的是()。

选择答案
未作答
答案与解析

正确答案 D

普通非空文本符合父类的使用约定,换成子类后却被拒绝。原本正确的调用因此失效,不能安全替换,选D。继承关系存在、方法名相同,都不足以保证行为契约成立。

拿最简单的输入“hello”试一次就能看清:父类承诺接受,子类要求带XML标签而拒绝,调用者必须知道具体子类并额外改造输入。这样就没有保持父类对使用者作出的承诺。里氏替换并不禁止子类增加能力,也不要求内部算法完全相同;关键是仍能履行父类既有约定。若新增能力只能接受XML,可以把它作为明确的独立操作或重新设计抽象,而不能一边宣称可替换,一边收紧原操作的使用条件。反之,题干若事先约定父类只接受XML,结论就要随这个前提重新判断。

选项分析

A
签名相同只说明调用形式兼容,仍要检查合法输入、返回结果及其他行为承诺。
B
允许扩展不等于允许破坏原功能,新增前提已经使原本合法的普通文本调用失败。
C
强迫原调用者迁就具体子类,恰好暴露替换失败,不能据此证明原继承设计正确。
D
利用父类允许而子类拒绝的具体输入,直接证明既有契约没有得到保持。

容易混淆的地方

只核对是否写了继承、方法是否同名,没有用父类承诺允许的输入实际检验替换后的行为。

再巩固一步

  • 遇到里氏替换题,找一个父类允许的正常调用,检查换成子类后是否仍满足原约定。
原创章节练习题 · 第三版 · 《系统集成项目管理工程师教程》第3版 · 5.3.2 · 纸书第216页

练习小结

题目纠错

未发送。正式接收渠道尚未接通。

查看纠错信息