面向对象的原则之替换原则

124 篇文章 139 订阅
13 篇文章 0 订阅

替换原则

  替换原则由MIT计算机科学实验室的Liskov女士在1987年的OOPSLA大会上的一篇文章《Data Abstraction and Hierarchy》中提出,主要阐述有关继承的一些原则,故又称里氏替换原则。

  2002年,Robert C.Martin出版了一本名为《Agile Software Development Principles Patterns and Practices》的书,在书中他把里氏代换原则最终简化为一句话:“Subtypes must be substitutable for their base types”。(子类必须能够替换成它们的基类。)

LSP的内容

  里氏替换原则(Liskov Substitution Principle,LSP)的定义和主要的思想如下:由于面向对象编程技术中的继承在具体的编程中过于简单,在许多系统的设计和编程实现中,我们并没有认真地、理性地思考应用系统中各个类之间的继承关系是否合适,派生类是否能正确地对其基类中的某些方法进行重写等问题。因此经常出现滥用继承或者错误地进行了继承等现象,给系统的后期维护带来不少麻烦。这就需要我们有一个设计原则来遵循,它就是替换原则。

  LSP指出:子类型必须能够替换掉它们的父类型、并出现在父类能够出现的任何地方。它指导我们如何正确地进行继承与派生,并合理地重用代码。此原则认为,一个软件实体如果使用一个基类的话,那么一定适用于其子类,而且这根本不能察觉出基类对象和子类对象的区别。

LSP主要是针对继承的设计原则

  因为继承与派生是OOP的一个主要特性,能够减少代码的重复编程实现,从而实现系统中的代码复用,但如何正确地进行继承设计和合理地应用继承机制呢?

  这就是LSP所要解决的问题:

  如何正确地进行继承方面的设计?

  最佳的继承层次如何获得?

  怎样避免所设计的类层次陷入不符合OCP原则的状况?

  那如何遵守该设计原则呢?

  父类的方法都要在子类中实现或者重写,并且派生类只实现其抽象类中声明的方法,而不应当给出多余的方法定义或实现。

  在客户端程序中只应该使用父类对象而不应当直接使用子类对象,这样可以实现运行期绑定(动态多态)。

  如果A、B两个类违反了LSP的设计,通常的做法是创建一个新的抽象类C,作为两个具体类的超类,将A和B的共同行为移动到C中,从而解决A和B行为不完全一致的问题。

  PHP对LSP的支持并不好,缺乏向上转型等概念,只能通过一些曲折的方法实现。对于这个原则,这里就不再细讲了。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值