当前位置: 首页 > 后端技术 > Java

哪些代码破坏了LSP?

时间:2023-04-01 16:03:25 Java

哪些代码破坏了LSP?其实李式替换原则还有另外一种描述更实用更有指导意义,那就是DesignByContract。中文翻译是根据协议设计的。子类在设计时,必须遵守父类的行为约定(或协议)。父类定义了函数的行为契约,子类可以改变函数的内部实现逻辑,但不能改变函数原有的行为契约。这里的行为约定包括:函数声明要实现的功能;关于输入、输出和异常的协议;评论中列出的任何特殊说明。其实定义中父类和子类的关系也可以用接口和实现类的关系代替。为了更好地理解这句话,我举几个违反礼体代入原则的例子来说明。子类违反了父类声明的功能。父类中提供的sortOrdersByAmount()订单排序函数将订单按照金额从小到大排序。子类重写sortOrdersByAmount()订单排序函数后,根据创建日期对订单进行排序。子类的设计违反了李式替换原则。子类违反了父类对输入、输出和异常的约定。在父类中,某个函数约定:出错时返回null,获取到的数据为空时返回一个空集合(emptycollection)。子类重载该函数后,实现发生变化,运行失败返回异常,获取不到数据返回null。子类的设计违反了李式替换原则。在父类中,一个函数约定输入数据可以是任意整数,但是子类实现时,只允许输入数据为正整数,负数抛出,即校验比子类对输入数据的要求如果父类比较严格,那么子类的设计就违反了李式代换原则。在父类中,某个函数约定只能抛出ArgumentNullException异常,而子类的设计和实现只允许抛出ArgumentNullException异常。抛出任何其他异常都会导致子类违反Li型替换原则。子类违反了父类注释中列出的任何特殊说明。父类中定义的withdraw()取款函数的注释为:“用户的取款金额不得超过账户余额...”,子类重写withdraw()函数后,为该用户实现透支取款功能VIP账户,即取款金额可以大于账户余额,所以该子类的设计不符合李式置换原则。以上是违反李式代换原则的三种典型情况。另外,还有一个判断子类的设计和实现是否违反李式替换原则的技巧,就是利用父类的单元测试来验证子类的代码。如果某些单元测试运行失败,可能说明子类的设计和实现没有完全遵守父类的约定,子类可能违反了李式替换原则。其实大家有没有发现李式代换的原则很松散。一般来说,我们写的代码不太可能违反它。所以,只要你能看懂我今天讲的,这个道理就不难掌握,也不难应用。多态和Li型替换虽然在定义描述和代码实现上有些相似,但是侧重点不同。多态性是面向对象程序设计的一大特点,是面向对象程序设计语言的一种语法。是一种代码实现的思路。字面替换是一种设计原则,用来指导继承关系中子类的设计。子类的设计要保证在替换父类时,不改变原程序的逻辑,不破坏原程序。正确性。更多原创阅读:https://javawu.com