六大原则之“里氏替代原则(LSP)“笔记 - yuanlong_zheng的专栏 - 博客频道 - CSDN.pdfVIP

六大原则之“里氏替代原则(LSP)“笔记 - yuanlong_zheng的专栏 - 博客频道 - CSDN.pdf

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
2016/11/13 六大原则之“里氏替代原则 (LSP)“笔记 - yuanlong_zheng 的专栏 - 博客频道 - CSDN.NET 六大原则之“里氏替代原则 (LSP )“笔记 版权声明:本文为博主原创文章,未经博主允许不得转载。 1. 里氏替代原则,(Liskov Sub stitution Principle, LSP ) 定义:Functions that use pointers or referrnces to base classes must be able to use objects of derived classes without knowing it.(所有引用基类的地方必须能透明地使用其子类的对象。) 2.理解:只要父类能出现的地方,子类就可以出现,并且替换为子类也不会产生任何错误或异常,使用者可能根本就不 需要知道是父类还是子类。但反之,未要求。 继承机制的优点: 代码共享,减少创建类的工作量; 提高代码的重用性; 子类可以形似父类,又异于父类; 提高父类的扩展性,实现父类的方法即可随意而为; 提高产品或项。 继承机制的缺点: 继承是入侵性的 (只要继承,就必须拥有父类的所有属性与方法); 降低了代码的灵活性 (子类拥有了父类的属性方法,会增多约束); 增强了耦合性 (当父类的常量、变量、方法被修改时,必需要考虑子类的修改)。 定义所包含的四层意思: (另一种通俗的LSP原则讲解:子类可以扩展父类的功能,但不能改变父类原有的功能) 1. 子类可以实现父的抽象方法,但不能覆盖父类的非抽象方法 (做系统设计时,经常会定义一个接口或抽象类,然后 编码实现 (定义的方法或接口),调用类则直接传入接口或抽象类,这里也是LSP的应用体现); 2. 子类可以有自己的方法和属性 (因为LSP可以正用,不能反用:在子类出现的地方,父类未必就可以胜任 (本来就 无此要求)。即不要死扣——所有的地方 (如参数)都要以父类的形式出现 (再作转化),实现中有需要依赖子类 的情况,这是正常的); 3. 覆盖或实现父类的方法时输入参数可以被放大 (放大的实质为重载,因为参数不同;为什么只能放大?因为父类方 法的参数类型相对较小,所以当传入父类方法的参数类型 (或更窄类型)时,重载时,将优先匹配父类的方法,因 此子类重载的方法并不会对此参数类型被执行,因此保证了LSP ,且不会引起想不到的业务逻辑混乱。若为覆写, 则程序员必清楚其逻辑要义); 4. 覆写或实现父类的方法时输出结果可以被缩小 (若放大,还能用子类替换父类吗?)。 Liskov替换原则并不是要求子类不能新增父类没有的方法或者属性。因为从调用父类的客户程序的角度来说,它关心的 仅仅是父类的行为,只要子类对于父类的行为是可替换的,就不算是违背该原则。 恰恰相反,当你发现父类拥有子类不希望继承,或者勉强继承会对子类造成破坏时 ,正可以说明这个继承体系可能存 在问题,违背了Liskov替换原则。这就充分说明,子类并不关心父类的行为,但却需要遵循父类制定的规范或契约,以 满足客户调用父类的期望。正所谓萧规曹随 ,如果前人制定的规范我们不遵循,反而要去打破,那就不是继承,而是 铁了心要另起炉灶了。 一个经典的违反Liskov替换原则的例子是正方形与矩形之间的关系。这样的例子在谈对象设计的原则时,已经啰嗦得够 多,这里我就不再赘述了 。这个例子带来的教训就是,现实世界中继承的例子,不能够完全直接套用在程序世界中。 不过,作为设计的参照物,现实世界的很多规律与法则,我们仍然不可忽视。例如鲸鱼和鱼,应该属于什么关系?从生 物学的角度看,鲸鱼应该属于哺乳动物,而不是鱼类。 http://blog ./yuanlong_zheng/article/details/7425919 1/5 2016/11/13 六大原则之“里氏替代原则 (LSP)“笔记 - yuanlong_zheng 的专栏 - 博客频道 - CSDN.NET 3.问题由来 有一功能P1,由类A完成。现需要将功能P1进行扩展,扩展后的功能为P ,其中P 由原有功能P1与新功能P2组成。新功 能P 由类A的子类B来完成,则子类B在完成新功能P2的同时,有会导原有功能P1发生故障。解决方案:遵循LSP :类B在 继承类A时,除添加新的方法完成新增功能P2外,尽量不要重写父类A的方法,也尽量不要重载父类的A的方法。 即为正确使用继承的好处。 5.1 如何根据

文档评论(0)

JuanHuang + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档