`
student_lp
  • 浏览: 432039 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

编程模式---里氏代换原则(LSP)

阅读更多

     从“开-闭”原则中可以看出面向对象涉及的重要原则是创建抽象化,并且从抽象化导出具体化。具体化可以给出不同的版本,每一个版本都给出不同的实现。从抽象化到具体化的导出要使用继承关系和这里要引入的里氏代换原则。

一、什么是里氏代换原则

     里氏代换原则描述如下:如果对每一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有的对象o1都替换成o2时,程序P的行为没有变化,那么类型T2是类型T1的子类型。换言之,一个软件实体如果使用的是一个基础类的话,那么一定适用于其子类,而且他根本不能觉察出基类对象和子类对象的区别。

    假设有两个类,一个是base类,另一个是extend类,并且extend类时base类的子类。那么一个方法如果可以接受一个基类b的话:method(base b);那么他必然可以接受一个子类对象e,也即可以有method(e).

     里氏代换原则是继承复用的基石。要有当衍生类可以替换掉基类,软件单位的功能不会受到影响时,基类才能正真被复用,而衍生类也才能够在基类的基础上增加新的行为。

注意:反过来的代换不成立

     必须要指出的是,反过来的代换则不成立,即如果一个软件实体适用的是一个子类的话,那么他不一定适用于基类。如果一个方法method接受子类对象为参数的话method(extend e),那么一般而言不可以有method(base b)。

二、java对里氏代换的支持

     里氏代换要求凡是基类型适用的地方,子类型一定适用,因此子类必须具备基类型的全部接口。或者说,子类型的接口必须包括全部的基类型的接口,而且还有可能更宽。如果一个java程序破坏了这一条件,java编译器就会给出编译时期的错误。在其他语言中这一特点也是适用的。

     例如,客户端要调用超类型的一个公开方法。如果以子类型代之,这个方法却变成了私有的,客户端不可能调用。显然这是违反了里氏代换原则的,java编译器根本不会让这样的程序过关。

三、java对里氏代换支持的局限

     java编译器的检查是有限的。例如:描述一个物体大小的量有精度和准度两个属性。所谓精度,就是这个量的有效数字有多少位;所谓准度,是这个量与真实的物体大小符合到什么程度。一个量可以有很高的精度,但是无法与真实的物体的情况相吻合。java语言编译器能够检查的,仅仅是相当于精度属性而已,它无法检查这个量与真实物体的差距。

     换言之,java编译器不能检查一个系统在实现和商业逻辑上是否满足里氏代换法则。一个著名的例子就是“正方形类是否是长方形的子类”的问题。

四、墨子论道

     ①《墨子·小取》中说“白马,马也;乘白马,乘马也。骊马,马也;乘骊马,乘马也。”所谓的骊马,便是黑色的马。墨子在这里说的是,不论黑马、白马均是马的一种。既然马可以骑,那么白马和黑马必可骑。这也就说出了里氏代换的精髓:父类适合的地方,那么用子类也一定适合。

     ②《墨子·小取》中说“娣,美人也,爱娣,非爱美人也... ...盗,人也,恶盗,非恶人也。”娣便是妹妹,哥哥爱妹妹,是因为两人的兄妹关系,而不是因为妹妹是个美人。因此,喜爱妹妹不代表喜爱美人。在面向对象的演员来说,美人是一个基类,妹妹是美人的子类。哥哥可以作为一个类有个“喜爱()”方法,接受妹妹作为参数。却不一定接受美人类的实例。

五、总结

     里氏代换原则讲的是基类和子类的关系。只有当这种关系存在时,里氏代换关系才存在;反之则不存在。有关其他的例子,大家可以搜索一下正方形为什么不能是长方形的子类,而需要引申出一个四边形。

 

 

本文通过总结《java与模式》而来。

分享到:
评论

相关推荐

    java的里氏代换原则

    简单来说,里氏代换原则(LSP,Liskov Substitution Principle)指的是在软件工程中,任何引用基类的地方都能被其子类替代,而不会改变程序原有的行为。这意味着子类应该能够完全无缝地替换掉基类,使得系统在使用...

    第二十八讲:基础三里氏代换原则

    在面向对象设计中,三里氏代换原则(Liskov Substitution Principle,简称LSP)是一个核心的设计原则,它由芭芭拉·里科夫(Barbara Liskov)在1988年提出。这个原则是类型继承关系中的一个重要准则,旨在确保软件...

    里氏替换原则Demo

    里氏替换原则(Liskov Substitution Principle,简称LSP)是面向对象设计的基本原则之一,它是由美国计算机科学家芭芭拉·里科夫(Barbara Liskov)提出的。这个原则强调的是在软件工程中,子类型必须能够替换它们的...

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

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

    13丨软件设计的里氏替换原则:正方形可以继承长方形吗?.pdf

    里氏替换原则(Liskov Substitution Principle,简称LSP)是面向对象设计的基本原则之一,由Barbara Liskov在1988年提出。该原则指出,子类型必须能够替换它们的基类型而不影响程序的正确性。这意味着在软件系统中,...

    里氏代换原则_动力节点Java学院整理

    里氏代换原则是面向对象设计的基本原则之一,它的核心思想是确保软件系统的各个组件能够灵活替换而不影响整体系统的稳定性。这一原则由Barbara Liskov在1988年提出,因此也被称为Liskov替换原则(LSP)。在Java和...

    设计模式Demo

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

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

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

    软件设计的七大原则.doc

    二、 里氏代换原则(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 合成/聚合复用原则...

    设计模式六大原则 .docx

    4、里氏代换原则(LSP) 里氏代换原则指出,子类应当能够替换其父类并保持程序行为不变。这意味着,如果一个模块可以接受父类对象,那么它也应该能接受任何子类对象,而不引起问题。遵循LSP可以确保代码的稳定性和可...

    软件设计的七大原则

    二、 里氏代换原则(LSP) 里氏代换原则是指子类型必须能够替换它们的基类型。反过来的代换不成立。当两个具体类关系违反里氏代换原则时,一种办法是抽象出一个基类,作为这两个类的父类,一种是应用组合聚合关系...

    C#设计模式

    里氏代换原则(Liskov Substitution Principle,LSP)指出,子类必须能够替换它们的基类,而不影响程序的正确性。这意味着子类可以无缝地在基类出现的地方使用,保证了代码的稳定性和可扩展性。遵循这一原则,我们...

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

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

    面向对象编程的设计原则详述

    3. **里氏代换原则(LSP)**:所有引用基类对象的地方都可以透明地使用其子类对象,而不影响程序的正确性。这意味着子类必须完全遵循父类的行为规范,以确保替换时不会引入错误。 4. **依赖倒转原则(DIP)**:高层模块...

    面向对象的设计的原则 电子版

    3. 里氏代换原则(LSP):所有引用基类(父类)的地方必须能透明地使用其子类的对象。里氏代换原则告诉我们,在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立,如果一个...

    课堂练习04301

    3. **里氏代换原则 (LSP)**:根据里氏代换原则,如果软件系统中一个对象可以被其基类对象替换而不影响系统的行为,那么这个系统就遵循了LSP。这保证了子类可以无损地替换其基类,增强了软件的可扩展性和兼容性。 4....

    C#设计模式.doc

    里氏代换原则(LSP)强调子类应当可以替换其基类而不影响程序的正确性。遵循LSP有助于保持代码的稳定性和可预测性,同时也是多态性的基础。 依赖倒置原则(DIP)指出应依赖于抽象,而不是具体的实现。在C#中,这...

    java设计模式考试题.docx

    题目中提到的里氏代换原则(LSP)是面向对象设计的一个重要补充原则(选C)。 3. **Open-Close原则**:Open-Close原则指的是软件实体(如类、模块、函数等)应当对扩展开放,对修改关闭(选A),这意味着增加新的...

Global site tag (gtag.js) - Google Analytics