前言: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替换原则)的更多相关文章

  1. Liskov替换原则(LSP)

    OCP背后的主要机制是抽象和多态.在静态类型语言中,比如C++和Java,支持抽象和多态的关键机制之一是继承.正是使用了继承,才可以创建实现其基类中抽象方法的派生类.是什么设计规则在支配着这种特殊的继 ...

  2. 敏捷软件开发:原则、模式与实践——第10章 LSP:Liskov替换原则

    第10章 LSP:Liskov替换原则    Liskov替换原则:子类型(subtype)必须能够替换掉它们的基类型(base type). 10.1 违反LSP的情形 10.1.1 简单例子 对L ...

  3. 编码最佳实践——Liskov替换原则

    Liskov替换原则(Liskov Substitution Principle)是一组用于创建继承层次结构的指导原则.按照Liskov替换原则创建的继承层次结构中,客户端代码能够放心的使用它的任意类 ...

  4. 软件设计----LisKov替换原则(LSP)

    LisKov替换原则的定义:一个软件实体如果使用的是一个基类的话,一定适用于其子类,而且根本不能觉察出基类对象和子类对象的区别. 1)怎么理解上面的概念?就是我们程序设计的子类型能够完全替换父类型,而 ...

  5. 设计模式学习--面向对象的5条设计原则之Liskov替换原则--LSP

    一.LSP简介(LSP--Liskov Substitution Principle): 定义:如果对于类型S的每一个对象o1,都有一个类型T的对象o2,使对于任意用类型T定义的程序P,将o2替换为o ...

  6. Liskov替换原则

    一.定义 子类型必须能替换掉它们的基类型 二.提取公共部分的方法代替继承 如果一组类都支持一个公共的职责,那么它们应该从一个公共的超类继承该职责. 如果公共的超类不存在,那么就创建一个,并把公共的职责 ...

  7. Liskov替换原则(LSP)

    OCP中,继承支持了抽象和多态特性. LSP:子类必须能够替换掉其基类. 反例:使用if/else判断类型,以便选择针对特定类型的正确行为. 有效性并非本质属性 模型的有效性,只能通过它的客户程序来表 ...

  8. 百度云世界里的“七种武器”:PCS、BAE、Site App、ScreenX等

    如果说去年百度世界的关键词是“百度新首页”的话,那么今年在研发者人群中,对百度世界最深的印象就是“七种武器”,即在云的世界里,百度为开发者所提供的包括个人云存储.LBS.移动云测试中心等在内的七种工具 ...

  9. 2.里氏替换原则(Liskov Substitution Principle)

    1.定义 里氏替换原则的定义有两种,据说是由麻省理工的一位姓里的女士所提出,因此以其名进行命名. 定义1:如果对一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1所定义的程序P中在o1全都 ...

随机推荐

  1. 【COGS & USACO Training】710. 命名那个数字(hash+水题+dfs)

    http://cojs.tk/cogs/problem/problem.php?pid=710 近日开始刷水... 此题我为了练一下hash...但是hash跑得比暴力还慢.. 不言而喻... #in ...

  2. iOS下json的解析 NSJSONSerialization

      - (IBAction)JOSNButtonPressed:(id)sender { NSString *str=[@"http://douban.fm/j/mine/playlist? ...

  3. shell.application asp多种组件执行cmd 单文件版本

    <%@ Language="VBScript" %> <% ) theComponent() = "Scripting.FileSystemObject ...

  4. Ubuntu 14.04 使用的一些笔记

    1. 今天下载了安卓的2.3.5的源代码,解压tar的时候,发现一个错误中断了解压过程: could not create the hard link file, 看了一下基本上都是每个主目录下的 . ...

  5. NodeJs - 100

    Nodejs官方文档 https://nodejs.org/en/docs/ Nodejs官方网站 https://nodejs.org/en/ Nodejs的特征:  1.采用非阻塞性IO机制:—— ...

  6. PHP显示日期、周几、农历初几、什么节日函数编程代码

    <?function rili($style,$Atime){ $debug = false; $glmonth = date("n",$Atime);    //1-12  ...

  7. RestSharp用法小结

    今天有空,小结一下RestSharp的用法. RestSharp内置了XML和JSON的反序列化(deserializers ). application/json – JsonDeserialize ...

  8. HTML&CSS----练习隐藏导航栏(初级)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. HP StorageWorks MSL2024 Tape Libraries - Robotic Error Sub-Codes

    Robotic error sub-codes Mechanical initialization failure 02 Connection to slave robotic failed 03 E ...

  10. 【液晶模块系列基础视频】5.2.X-GUI字体驱动2

    ============================= 技术论坛:http://www.eeschool.org 博客地址:http://xiaomagee.cnblogs.com 官方网店:ht ...