首页 > 自考资讯 > 自考资讯

设计模式之美15:李式替换(LSP)和多态有什么区别?违反了哪些代码

2024-10-09

大家好,今天来为大家分享设计模式之美15:李式替换(LSP)和多态有什么区别?违反了哪些代码的一些知识点,和的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!

如何理解“里式替换原则”?

里氏替换原理,缩写为LSP,描述:

子类型/派生类的对象可以在程序中任意位置替换基/父类的对象,同时保证原程序的逻辑行为不变,正确性不变。被毁了。

多态性是面向对象编程的一大特征,也是面向对象编程语言的一种语法。替换是一个设计原则,用于指导如何设计继承关系中的子类。子类的设计应该保证在替换父类时,不改变原程序的逻辑,不破坏原程序的正确性。

设计模式之美15:李式替换(LSP)和多态有什么区别?违反了哪些代码

哪些代码明显违背了 LSP?

李式替代原则还有一个更实用、更有指导意义的描述,那就是“DesignBy Contract”,中文翻译为“根据协议设计”。

为了更好地理解这句话,我举几个违反李式替换原则的例子来解释一下。

父类中提供的sortOrdersByAmount()订单排序函数,按照金额从小到大对订单进行排序。子类重写sortOrdersByAmount()订单排序函数后,按照创建日期对订单进行排序。该子类的设计违反了替换原则。

设计模式之美15:李式替换(LSP)和多态有什么区别?违反了哪些代码

2. 子类违反了父类关于输入、输出和异常的约定。

父类中某个函数约定:出错时返回null,获取到的数据为空时返回空集合。子类重载该函数后,实现发生变化,如果运行出错则返回异常,如果无法获取数据则返回null。该子类的设计违反了替换原则。

3.子类违反了父类注释中列出的任何特殊指令

父类中定义的withdraw()函数注释为:“用户提现金额不得超过账户余额……”,子类重写了withdraw()函数后,针对VIP账户实现。透支提款的功能,即提款金额可以大于账户余额,因此该子品类的设计不符合替代原则。

设计模式之美15:李式替换(LSP)和多态有什么区别?违反了哪些代码

判断是否违反替换原则的提示:

用户评论

关于道别

这篇文章解释得非常清晰!我一直对设计模式有些困惑,特别是里式替换原则和多态的关系,你写的案例也很贴切,一下子就理解了。

    有12位网友表示赞同!

醉枫染墨

多态性跟LSP确实很像,都是关于对象的使用灵活程度,但我觉得LSP更强调子类是父类的“精炼版”,不能打破父类原有的预期行为,这点很有意思!要好好学习一下。

    有15位网友表示赞同!

可儿

我也是学了设计模式之后才明白里式替换原则的用意,原来是为了保证代码的可维护性和复用性。这个例子很好的说明了如果违反LSP带来的后果,一定要牢记这一点!

    有7位网友表示赞同!

丢了爱情i

这篇文章说的很对,不符合LSP的代码确实很可怕,一旦有变化就可能导致一系列问题。学习设计模式真的是太重要了,它可以帮助我们写出更加稳健和可扩展的程序!

    有12位网友表示赞同!

忘故

说真的,很多时候我都是蒙着做项目,还没仔细思考设计原则的问题。这篇文章让我意识到设计模式的重要性,以后一定要好好学习一下!

    有11位网友表示赞同!

颜洛殇

里式替换原则其实就是子类要能够完美替代父类呀,这个感觉有点像“继承”,但强调的是行为一致性,而不是只是继承属性吧?

    有9位网友表示赞同!

浮光浅夏ζ

还是觉得多态更方便一些,可以直接new对象使用多态的方式访问方法,LSP这种机制感觉太过于严格了。不过明白它是为了保证代码的稳定性,这一点还是很有价值的。

    有13位网友表示赞同!

颓废人士

我个人认为学习设计模式需要结合实战经验,理论只是基础,只有在实际项目中应用才能真正理解它们的意义。这篇文章提醒我们要注意LSP原则,感谢分享!

    有15位网友表示赞同!

别留遗憾

这个例子写的有点太偏了,感觉像故意找一个特例来强调违反LSP的危害。设计模式应该是灵活且适应多种场景的,应该鼓励更多不同的思考方式,而不是死板地要求符合某种规则。

    有17位网友表示赞同!

追忆思域。

我感觉里式替换原则这个定义还是有点模糊,需要更具体的例子来说明它的含义和应用场景,理论理解很重要,但实践体验更能加深对设计的理解

    有11位网友表示赞同!

断秋风

代码的安全性跟风格怎么能够用一个设计模式来保证呢?我觉得这篇文章偏离了设计模式本身的初衷。我们应该更加注重代码的可维护性和可扩展性!

    有9位网友表示赞同!

走过海棠暮

多态和LSP确实有区别,但很多时候它们可以互补运用,比如子类继承父类的功能并进行一定的扩展,同时保持与父类方法签本当致,这样就实现了多态性与LSP的结合,代码实现更加灵活!

    有20位网友表示赞同!

巴黎盛开的樱花

这篇文章说的很有道理,设计模式确实需要用心学习和理解,不能简单地将其当做一种工具使用。 我们要从根本上掌握它们的设计思想,才能写出真正高品质的代码。

    有18位网友表示赞同!

景忧丶枫涩帘淞幕雨

学习设计模式确实是一项长期任务,需要不断实践和积累经验。这篇文章对里式替换原则的解释比较清晰,让我对这个概念有了更深入的理解。谢谢分享!

    有6位网友表示赞同!

未来未必来

我觉得这篇文章有些过于强调LSP的绝对性,并没有考虑到实际应用场景下的复杂程度。 设计模式应该灵活运用,不能一味地追求一种最完美的理论化形式。

    有13位网友表示赞同!

冷嘲热讽i

在项目开发中,我常常会遇到需要扩展现有功能的情况,这时候就需要用到里式替换原则来保证新实现与原有代码之间的良性互动。文章中的例子很有帮助!

    有12位网友表示赞同!

泪湿青衫

多态和LSP的关系确实让我困惑很久了,看了这篇文章,我觉得LSP像是多态的更深一层的设计理念,它强调的是子类要符合父类的预期,才能真正实现多态的效果。

    有6位网友表示赞同!

猜你喜欢