`

里氏代换原则(LSP)

 
阅读更多

任何基类可以出现的地方,子类一定可以出现(反过来不成立)。

这好像是描述了继承的一种原则,确实,在实现继承的时候,我们尽量考虑一下,java编译器能够检查语法上对里氏代换原则的支持,但是并不能支持商业逻辑上的LSP。考虑一个比较著名的长方形与正方形的问题,它能帮助我们更加深刻的理解LSP原则。

         通常,在数学上来看,正方形确实属于长方形的一种,依照这种思维,正方形继承于长方形也是自然不过了。但是别忘了,长方形的定义是什么?长方形的高小于等于长方形的宽,下面是针对LSP原则的一段测试代码:     

Public void resize(Rectangle r){

While(r.getHeight() <= r.getWidth()){

r.setWidth(r.getWidth() + 1);

}

}

         试试LSP原则在这段测试代码中成不成立:当传入的是一个长方形,它的意义在于增加长方形的高度直到不大于长方形的宽度为止,如果传入的是一个正方形,长方形的子类,想象一下,这段代码会出现什么样的结果,因为正方形的高永远等于长方形的宽,这个循环永远持续下去,直到栈溢出为止。

         还有一个例子,java.util库中的properties继承于hashtable,但是properties是一种特殊的hashtable,它只接受String类型的keyvalue,而超类hashtablekeyvalue却能接受任何的数据类型。这意味着,LSP在它们之间并不成立,所以,这是一个反面教材,时刻提醒我们,该在什么情况下使用继承。

分享到:
评论

相关推荐

    里氏代换原则案例程序LSP.zip

    里氏代换原则案例程序LSP.zip

    java 设计模式与Jar库

    java 设计模式与Jar库 里氏代换原则LSP 依赖倒转原则DIP 接口隔离原则ISP 合成/聚合复用原则CARP

    Java23种基本的设计模式整料整理学习源码示例zip

    里氏代换原则(Liskov Substitution Principle) 里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的...

    24种设计模式介绍与6大设计原则

    里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能...

    设计模式Demo

    里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能...

    SQL语句优化2

    里氏代换原则(LSP):一个软件实体如果使用的是一个基类的话,那么一定适用于其子类。 依赖倒转原则(DIP):要依赖于抽象,不要依赖于具体。 接口隔离原则(ISP):使用多个专门的接口比使用单一的总接口要好。 合成/...

    design_pattern:关于设计模式的理解

    2、里氏代换原则(Liskov Substitution Principle)里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉基类...

    酒店客房管理系统源码java-design_model:23种设计模式学习记录

    里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类(父类)与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。—— From Baidu 百科 3、...

    用 Objective-C 实现《大话设计模式》书中的例子,并用一些 Objective-C 的特性对例子的实现加以优化

    用 Objective-C 实现《大话设计模式》书中的例子,并用一些 Objective-C 的特性对例子的实现...里氏代换原则(LSP),子类型必须能够替换掉它们的父类型。 迪米特法则(LoD),如果两个类不必彼此直接通信,那么这两

    C#设计模式(PDF格式)

    C#设计模式(1) 4 一、 C# 面向对象程序设计复习 5 二、 设计模式举例 5 三、 先有鸡还是先有蛋? 7 四、 大瓶子套小瓶子还是小瓶子套大瓶子?...二、 里氏代换原则(LSP) 12 C#设计模式(3) 19 ....

    Java面向对象程序设计杨晓燕面向对象基本原则和模式.pptx

    子类型能够替换基类型原则 子类型能够替换基类型原则也叫里氏代换原则(Liskov Substitution Principle ,简称LSP),里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现,且程序运行正常。 特

    设计模式,软件开发者必读

    1.5.2 里氏代换原则(LISKOV SUBSTITUTION PRINCIPLE,常缩写为.LSP) 8 1.5.3 依赖倒置原则(DEPENDENCE INVERSION PRINCIPLE) 8 1.5.4 接口隔离原则(INTERFACE SEGREGATION PRINCIPLE, ISP) 9 1.5.5 合成/聚合复用原则...

    Design-Pattern:23种设计模式

    Design-Pattern 23种设计模式 创建型模式,共5种:单例模式、...里氏代换原则( Liskov Substitution Principle ,LSP ) 依赖倒转原则( Dependence Inversion Principle ,DIP ) 接口隔离法则(Interface Segregation Prin

    酒店客房管理系统源码java-DesignPattern:我总结的一些设计模式学习

    里氏代换原则(Liskov Substitution Principle):对开闭原则的补充。任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被...

    Java与模式(含示例代码)

    第7 章 里氏代换原则(LSP) .........79 7.1 美猴王的智慧...............................79 7.2 什么是里氏代换原则...................80 7.3 里氏代换原则在设计模式中的体现 ....... 82 7.4 墨子论“取譬”......

    C#设计模式大全

    二、 里氏代换原则(LSP) C#设计模式(3) 三、 依赖倒置原则(DIP) 四、 接口隔离原则(ISP) 五、 合成/聚合复用原则(CARP) 六、 迪米特法则(LoD) C#设计模式(4)-Simple Factory Pattern 一、 简单...

    C#设计模式.PDF

    二、 里氏代换原则(LSP) 12 C#设计模式(3) 19 三、 依赖倒置原则(DIP) 19 四、 接口隔离原则(ISP) 20 五、 合成/聚合复用原则(CARP) 21 六、 迪米特法则(LoD) 22 C#设计模式(4)-Simple Factory Pattern...

Global site tag (gtag.js) - Google Analytics