`
student_lp
  • 浏览: 437223 次
  • 性别: 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是继承复用的...

    面向对象设计原则Java概要.ppt

    里氏代换原则  里氏代换原则的意义 LSP保证了软件结构的稳定性,允许我们使用抽象类型进行编程,而不是具体类型。它提高了代码的可扩展性和可维护性,因为新添加的子类可以无缝地替换旧的子类,而不会破坏原有...

    设计模式design-pattern-java.pdf

    里氏代换原则(Liskov Substitution Principle, LSP)强调子类必须能够替换其基类,并且能够保证程序的正确性。这有助于避免在使用继承时可能出现的一些潜在问题。 #### 1.2.4 面向对象设计原则之依赖倒转原则 ...

    C#设计模式大全

    而里氏代换原则(LSP)则确保子类型可以替换其基类型而不影响程序的正确性。 #### 三、设计原则 - **开放-封闭原则(OCP)**:软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。 - **里氏代换原则(LSP)*...

    程序设计的七大原则

    #### 二、里氏代换原则 (Liskov Substitution Principle, LSP) 里氏代换原则是由芭芭拉·里氏提出的,它是继承复用的基础。该原则指出,如果一个软件实体使用一个基类,那么它也应该能够使用该基类的任何子类,并且...

    软件设计的七大原则.doc

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

    C#设计模式.PDF

    里氏代换原则(LSP) - **定义**:子类型必须能够替换掉它们的基类型。 - **目的**:确保子类可以继承父类的功能并加以扩展,而不改变程序原有的逻辑。 - **实现**:遵循此原则可以通过严格的类型检查和充分的测试...

    设计模式六大原则 .docx

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

    软件设计的七大原则

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

    设计模式C#版

    七、里氏代换原则(LSP) 里氏代换原则指出,在软件中,如果一个父类可以被替换成它的子类,而程序的行为不会发生变化,那么这些子类就可以被看作父类的类型。LSP有助于增强程序的健壮性,是多态和继承的基础。 八...

    C#设计模式

    四、里氏代换原则(LSP) 里氏代换原则规定,子类对象应当可以在任何父类对象可以出现的地方使用,而不会导致程序行为的异常或错误。这保证了代码的稳定性和可维护性,允许我们灵活地替换对象类型。 五、依赖倒置...

Global site tag (gtag.js) - Google Analytics