以下Person、Employee继承示例是否违反LSP(里氏替换原则)问题咨询
关于示例是否违反里氏替换原则的解答
问题1:Employee新增employeeCode校验规则是否违反LSP?
答案:不违反。
解释:里氏替换原则的核心要求是子类可以在任何父类出现的位置完成替换,且不会破坏原有程序的正确性,核心约束包括:子类不能强化父类的前置条件、不能弱化父类的后置条件、不能抛出父类契约未声明的非预期异常。
本示例中:
- 父类
Person的validate()方法契约明确为:校验实例自身状态合法性,不合法时抛出IllegalArgumentException - 子类
Employee重写validate()时仅新增了自有属性的校验逻辑,没有对调用方增加额外的前置条件要求,抛出的异常类型仍符合父类约定 - 示例中抛出异常的根本原因是构造了非法的
Employee实例(employeeCode为null),而非子类替换父类导致的逻辑破坏:如果构造合法的Employee实例,完全可以无缝替换所有Person出现的位置,不会产生预期外的行为。
问题2:因问题1答案为否,本问题无需作答。
问题3:子类改为抛出NullPointerException是否违反LSP?
答案:违反。
解释:父类validate()方法的公开契约中,只会抛出IllegalArgumentException表示状态非法。如果子类改为抛出父类契约未覆盖的NullPointerException,会导致原本只捕获IllegalArgumentException的调用方逻辑失效,出现预期外的程序崩溃,破坏了父类原有逻辑的正确性,不符合里氏替换原则的异常约束要求。
内容的提问来源于stack exchange,提问作者DXT
相关产品推荐
相关产品推荐

