LSP

Liskov Substitution Principle
里氏替换原则,OCP作为OO的高层原则,主张使用“抽象(Abstraction)”和“多态(Polymorphism)”将设计中的静态结构改为动态结构,维持设计的封闭性。“抽象”是语言提供的功能。“多态”由继承语义实现。

LSP:
1.概述: 派生类(子类)对象能够替换其基类(父类)对象被调用
2.概念: 
里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。(源自百度百科)
 
3.子类为什么可以替换父类的位置?: 
当满足继承的时候,父类肯定存在非私有成员,子类肯定是得到了父类的这些非私有成员(假设,父类的的成员全部是私有的,那么子类没办法从父类继承任何成员,也就不存在继承的概念了)。既然子类继承了父类的这些非私有成员,那么父类对象也就可以在子类对象中调用这些非私有成员。所以,子类对象可以替换父类对象的位置。
 
4.里氏代换原则优点: 
需求变化时,只须继承,而别的东西不会改变。由于里氏代换原则才使得开放封闭成为可能。这样使得子类在父类无需修改的话就可以扩展

LSP的原定义比较复杂,我们一般对里氏替换原则 LSP的解释为:子类对象能够替换父类对象,而程序逻辑不变。

里氏替换原则有至少以下两种含义:1. 里氏替换原则是针对继承而言的,如果继承是为了实现代码重用,也就是为了共享方法,那么共享的父类方法就应该保持不变,不能被子类重新定义

子类只能通过新添加方法来扩展功能,父类和子类都可以实例化,而子类继承的方法和父类是一样的,父类调用方法的地方,子类也可以调用同一个继承得来的,逻辑和父类一致的方法,这时用子类对象将父类对象替换掉时,当然逻辑一致,相安无事。

2. 如果继承的目的是为了多态,而多态的前提就是子类覆盖并重新定义父类的方法,为了符合LSP,我们应该将父类定义为抽象类,并定义抽象方法,让子类重新定义这些方法,当父类是抽象类时,父类就是不能实例化,所以也不存在可实例化的父类对象在程序里。也就不存在子类替换父类实例时逻辑不一致的可能。

不符合LSP的最常见的情况是,父类和子类都是可实例化的非抽象类,且父类的方法被子类重新定义,这一类的实现继承会造成父类和子类间的强耦合,也就是实际上并不相关的属性和方法牵强附会在一起,不利于程序扩展和维护。

如何符合LSP?总结一句话 —— 就是尽量不要从可实例化的父类中继承,而是要使用基于抽象类和接口的继承。

https://www.zhihu.com/question/27191817

在知识表示、面向对象程序设计与面向对象设计的领域里,is-a(英语:subsumption,包含架构)指的是类的父子继承关系,例如类D是另一个类B的子类(类B是类D的父类)。
中文名 Is-a 外文名subsumption 实 质 指的是类的父子继承关系 例 子 类D是另一个类B的子类
换句话说,通常"Dis aB"(B把D包含在内,或是D被包含在B内)指的是,概念体D物是概念体B物的特殊化,而概念体B物是概念体D物的一般化。举例来说,水果是苹果、橘子、芒果与其他水果的一般化。
在面向对象程序设计里,is-a类关系是在继承概念的背景之下所形成的。有一说法是,对于所有水果来说,苹果继承(英语:inherit)所有的属性,就像是肉质多的水果包住种子般。
is-a与has-a两者是不同的对比,是以整体-附属阶层关系所组成的。也可以是instance-of的对比:请参考型态与个例的区别。
在真实世界里设计一个模型时(例如计算机程序),尤其是物件与它的下一层从属物件,在has-a与is-a两者的关系上容易产生概念上的错误。

原文地址:https://www.cnblogs.com/softidea/p/9112412.html

时间: 2024-10-16 10:10:18

LSP的相关文章

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

第10章 LSP:Liskov替换原则    Liskov替换原则:子类型(subtype)必须能够替换掉它们的基类型(base type). 10.1 违反LSP的情形 10.1.1 简单例子 对LSP的违反导致了OCP的违反: struct Point { double x, y;} public enum ShapeType { square, circle }; public class Shape { private ShapeType type; public Shape(Shape

OO的五大原则:SRP、OCP、LSP、DIP、ISP

OO的五大原则是指SRP.OCP.LSP.DIP.ISP. SRP -- (Single Responsibility Principle 单一职责原则) OCP--开闭原则(Closed for Modification; Open for Extension) 现将近期整理的文档提供给大家,这里对LSP做重点的介绍,望对大家有帮助,在学习和使用OO设计的时候,我们应该明白:OO的出现使得软件工程师们能够用更接近真实世界的方法描述软件系统.然而,软件毕竟是建立在抽象层次上的东西,再怎么接近真实

程序设计原则——LSP

LSP原则,又叫做里氏替换原则(Liskov Substitution Principle),一个比较准确的定义如下: Function's that ues point or references tobase classes must be able to use objects of derived classes without knowing it. 所有引用基类的地方必需能透明的使用其子类对象 在使用LSP原则时,只要在父类能出现的地方必需能透明地使用其子类对象,而且替换为子类也不会

LSP“浏览器劫持概念

关于Winsock LSP“浏览器劫持”,中招者一直高居不下,由于其特殊性,直接删除而不恢复LSP的正常状态很可能会导致无法上网所以对其修复需慎重.   先说说什么是Winsock LSP“浏览器劫持”.Winsock LSP全称Windows Socket Layered Service Provider(分层服务提供商),它是Windows底层网络Socker通信需要经过的大门.一些流氓软件可以把自已加进去,就可以截取.访问.修改网络的数据包,可以随意添加广告,还能获取你的浏览习惯.这里加进

常见AutoCAD病毒(acad.fas、acad.lsp)清除方法

常见AutoCAD病毒(acad.fas.acad.lsp)清除方法 acad.fas.acad.lsp这两种病毒是最常见的CAD病毒了,而且往往同一时候出现.因为其本身对系统并不具备危害性,不过恶作剧程序罢了,因此大多数防病毒软件对它们不起作用,以下介绍手动删除方法. 第一步:查找硬盘.U盘内的 acad.fas.lcm.fas.acad.lsp.acadapp.lsp.acadappp.lsp 五个文件并删除干净(查找前请将显示隐藏和系统文件打开,这五个文件不一定同一时候出现.强烈建议使用T

面向对象设计原则三:里氏替换原则(LSP)

里氏替换原则(LSP)定义:在任何父类出现的地方都可以用它的子类类替换,且不影响功能.解释说明:其实LSP是对开闭原则的一个扩展,在OO思想中,我们知道对象是由一系列的状态和行为组成的,里氏替换原则说的就是在一个继承体系中,对象应该具有共同的外在特性,使用LSP时,如果想让我们的程序达到一个父类出现的地方都可以用它的子类来替换且不影响功能,那么这个父类也应该尽量声明出子类所需要的一些公共的方法,父类被子类替换之后,会比较顺利,那么为什么说它是对开闭原则的一个扩展呢?因为我们在开闭原则中说尽量使用

关于LSP协议故障导致无法上网解决办法

故障回顾: 一同事抱来笔记本,说他电脑安装某软件后导致无法正常上网. 故障定位: 通过CMD命令:ipconfig 查看IP.网关.dns址址是否正常. 通过ping网关,DNS测试连接性,结果正常. 通过nslookup 查看域名解析,发现异常.默认服务器非正常DNS服务器.怀疑DNS劫持,于是我手动修改DNS为114.114.114.114.重新nslookup,结果还是异常.问题排到这里我开始有点没有头绪了,hosts文件问题?IP协议簇问题?病毒问题? 检查hosts文件,果然里头文件明

里氏替换原则(Liskov Substitution Principle) LSP

using System; using System.Collections.Generic; using System.Text; namespace LiskovSubstitutionPrinciple { //里氏替换原则(Liskov Substitution Principle) LSP //If for each object o1 of type S there is an object o2 of type T such that for all programs P defi

连载:面向对象葵花宝典:思想、技巧与实践(32) - LSP原则

LSP是唯一一个以人名命名的设计原则,并且作者还是一个"女博士"  ============================================================= LSP,Liskov substitution principle,中文翻译为"里氏替换原则". 这是面向对象原则中唯一一个以人名命名的原则,尽管Liskov在中国的知名度没有UNIX的几位巨匠(Kenneth Thompson.Dennis Ritchie).GOF四人帮那么

Java 设计模式(十一) 里氏替换原则(LSP)

里氏替换原则(Liskov Substitution Principle) LSP的基本概念 定义: 所有引用基类的地方必须能透明地使用其子类的对象 只要父类能出现的地方子类就可出现,而且替换为子类也不会产生任何错误或异常,使用者可能根本就不需要知道是父类还是子类(封装造成的多态性) 规范 子类必须完全实现父类的方法 在类中调用其他类时必然要使用父类或者接口,如果子类中不支持父类中的方法,自然就违背了LSP 子类要有自己的特性 子类是在父类的基础上实现的,有自己的特性 这也就导致了LSP的单向性