面向对象世界里转转七(Liskov替换原则)
前言:Liskov替换原则是关于继承机制的应用原则,是实现开放封闭原则的具体规范,违反了Liskov原则必然意味着违反了开放封闭原则.因此,有必要对面向对象的继承机制及其基本原则做以探索,来进一步了解面向对象中实现抽象,多态技术的基础;继承及其规范
核心思想:
子类必须能够替换其基类.
这一思想体现为对继承机制的约束规范,只有子类能够替换其基类时,才能保证系统在运行期内识别子类,这是保证继承复用的基类.在父类和子类的具体实现中,必须严格把握继承层次中的关系和特征,将基类替换为子类,程序的行为不会发生任何变化.同时,这一约束反过来则是不成立的,子类可以替换基类,但是基类不一定能替换子类.
在面向对象设计中,子类继承于父类,其关系是以IS-A确定的,在.NET语言中以is关键字类判断两个对象的类型是否兼容,例如:Son is Father?Son:null
Liskov替换原则,主要着眼于对抽象和多态建立在继承的基础上,因此只有遵守了Liskov替换原则,才能保证继承复用是可靠的.实现的方法是面向接口编程:将公共部分抽象为基类接口或抽象类,通过Extact Abstract Class,在子类中通过覆写父类方法实现以新的方式支持同样的职责.
注意点:当程序代码中出现了子类与父类:方法调用必须进行显式的类型转换,就表明已经违反了LSP.这也意味着违反了Liskov替换原则就必然违反开放封闭原则,因此这种明显的违规应该被拒绝.开放封闭原则的关键是抽象,体现在基类和子类之间的抽象就是继承,因此LSP原则是实现抽象机制的实施规范,而.NET的虚函数技术能很好解决问题.
规则建议:
⑴Liskov替换原则是关于继承机制的设计原则,违反了Liskov替换原则就必然导致违反开放封闭原则.
⑵ Liskov替换原则能够保证系统具有良好的扩展性,同时实现基于多态的抽象机制,能够减少代码冗余,避免运行期的类别判别.
⑶子类必须满足基类和客户端对其的行为约定,客户端对行为的期望在基类和子类必须保持一致.
⑷IS-A是基于行为方式的,它依赖于客户端的调用方式,对象的行为方式才是值得关注的要素.
⑸子类的异常必须控制在父类可以预计的范围,否则将导致替换违规,违反了Liskov替换原则.
结论:因此,应该面向接口编程,要求父类尽可能使用接口或抽象类来实现,能够保证不违反Liskov替换原则.然而,除了明目张胆的违反LSP原则,有些时候对于LSP的违反是潜在的,从继承层次上并不能了解其问题.必须从客户的角度理解,才能发现子类的行为和客户对父类的期望是不是一致的.因此,按照客户程序的预期来保证子类和父类在行为上的相容,是Liskov替换原则的另一关键.
面向对象世界里转转七(Liskov替换原则)的更多相关文章
- Liskov替换原则(LSP)
OCP背后的主要机制是抽象和多态.在静态类型语言中,比如C++和Java,支持抽象和多态的关键机制之一是继承.正是使用了继承,才可以创建实现其基类中抽象方法的派生类.是什么设计规则在支配着这种特殊的继 ...
- 敏捷软件开发:原则、模式与实践——第10章 LSP:Liskov替换原则
第10章 LSP:Liskov替换原则 Liskov替换原则:子类型(subtype)必须能够替换掉它们的基类型(base type). 10.1 违反LSP的情形 10.1.1 简单例子 对L ...
- 编码最佳实践——Liskov替换原则
Liskov替换原则(Liskov Substitution Principle)是一组用于创建继承层次结构的指导原则.按照Liskov替换原则创建的继承层次结构中,客户端代码能够放心的使用它的任意类 ...
- 软件设计----LisKov替换原则(LSP)
LisKov替换原则的定义:一个软件实体如果使用的是一个基类的话,一定适用于其子类,而且根本不能觉察出基类对象和子类对象的区别. 1)怎么理解上面的概念?就是我们程序设计的子类型能够完全替换父类型,而 ...
- 设计模式学习--面向对象的5条设计原则之Liskov替换原则--LSP
一.LSP简介(LSP--Liskov Substitution Principle): 定义:如果对于类型S的每一个对象o1,都有一个类型T的对象o2,使对于任意用类型T定义的程序P,将o2替换为o ...
- Liskov替换原则
一.定义 子类型必须能替换掉它们的基类型 二.提取公共部分的方法代替继承 如果一组类都支持一个公共的职责,那么它们应该从一个公共的超类继承该职责. 如果公共的超类不存在,那么就创建一个,并把公共的职责 ...
- Liskov替换原则(LSP)
OCP中,继承支持了抽象和多态特性. LSP:子类必须能够替换掉其基类. 反例:使用if/else判断类型,以便选择针对特定类型的正确行为. 有效性并非本质属性 模型的有效性,只能通过它的客户程序来表 ...
- 百度云世界里的“七种武器”:PCS、BAE、Site App、ScreenX等
如果说去年百度世界的关键词是“百度新首页”的话,那么今年在研发者人群中,对百度世界最深的印象就是“七种武器”,即在云的世界里,百度为开发者所提供的包括个人云存储.LBS.移动云测试中心等在内的七种工具 ...
- 2.里氏替换原则(Liskov Substitution Principle)
1.定义 里氏替换原则的定义有两种,据说是由麻省理工的一位姓里的女士所提出,因此以其名进行命名. 定义1:如果对一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1所定义的程序P中在o1全都 ...
随机推荐
- SSH整合所需的jar包
Spring3.1+Hibernate3+Struts2的最新整合所需要的jar包 Spring的基本jar包: 1.org.springframework.web-3.1.4.RELEASE.jar ...
- js判断鼠标位置是否在某个div中
div的onmouseout事件让div消失时,会出现这样的情况,就是当鼠标移至div中的其它内容时,此时也判定为离开div,会触发 onmouseout事件,这样div中的内容就不能操作了.解决的办 ...
- 仿APP系列 - 超级强大的拖动插件(支持块级的拖拉,左右拖拉)
事实上不太适合做上拉刷新和下拉加载 官方地址 http://idangero.us/swiper demo http://idangero.us/swiper/demos/#.V5YV4_mF4dU ...
- Wps 方框里面加勾
1.选择插入-->选择符号 2.选择更多 3.选择 字体Wingdings 然后下拉到最后.就看到了
- [转]C# WinForm动态调用远程Web服务
本文转自:http://blog.csdn.net/muyangjun/article/details/7930871 1.添加服务引用 2.在弹出的添加服务引用对话框地址栏中输入WebService ...
- mongodb3.2.3 复制集安装步骤
mongodb 复制集 测试 node1: 172.18.20.161 47000 (主)node2: 172.18.20.162 47000 (副)node3: 172.18.20.163 4700 ...
- PHP 错误与异常 笔记与总结(16 )自定义异常处理器
可以使用自定义异常处理器来处理所有未捕获的异常(没有用 try/catch 捕获的异常). set_exception_handler():设置一个用户定义的异常处理函数,当一个未捕获的异常发生时所调 ...
- PHP 开发 APP 接口学习笔记与总结 - [ Linux ] 定时任务
定时任务可以使用 crontab 命令来设定: crontab -e #编辑某个用户的cron 服务 crontab -l #列出某个用户cron 服务的详细内容 crontab -r #删除某个 ...
- C#winform使用+=和-=订阅事件和移除事件订阅
1.C#winform中使用+=和-=订阅事件和移除事件订阅 2.可以使用+=给一个控件订阅多个事件,触发事件时按顺序执行,直到使用-=移除事件订阅为止.
- laravel 查看SQL语句
Route::get('/test-sql', function(){ DB::enableQueryLog(); $user = App\User::first(); return DB::getQ ...