Liskov Substitution Principle

Liskov Substitution Principle, 由Barbara Liskov 和 Jeannette Wing在93年提出,其原文为:“Let q(x) be a property provable about objects x of type T. Then q(y) should be true for objects y of type S where S is a subtype of T. ” 。通俗一点来说,LSP的意思是指,“An instance of a class should function as an instance of its superclass” (《Design Pattern Java Workbook》)。

字面上的意思不好理解,举一段程序:

import java.util.*;
public class a{
    
public static void main(String args[]){
        String names[] 
= {"name1", "name2"};
        
        List L 
= Arrays.asList(names);
        L.add(
"name3");
        
}
}

这段程序运行结果是什么?答案是:

java.lang.UnsupportedOperationException
    at java.util.AbstractList.add(Unknown Source)
    at java.util.AbstractList.add(Unknown Source)
    at a.main(a.java:
7)
Exception in thread 
"main" 

抛出异常的原因是由 asList() 返回的List不支持add方法。而我们只要把代码改为:

List L = new ArrayList(Arrays.asList(names));

运行就正常了。

我们知道,List, ArrayList, Array 都有一个公共的父类(接口)Collection, asList 最初就是在Collection声明的,所以我们说,这里违反了LSP原则。(当然,从字面上讲,这么说还需要我们把Java接口看成pure的虚类来看)

其实这只是很小的一点,记下备忘

Liskov替换原则(Liskov Substitution Principle) Liskov替换原则是由计算机科学家Barbara Liskov在1987年提出的,她的名字也因此得名。这个原则是面向对象编程中的重要原则之一,属于SOLID设计原则的一部分。 阅读详情

相关推荐

基于用户的协同过滤算法(userCF)

1.定义 userCF:当一个用户A需要个性化推荐时,可以先找到和他有相似兴趣的其他用户,然后把那些用户喜欢的、而用户A没有听说过的物品推荐给A。这种方法称为基于用户的协同过滤算法。 基于用户的协同过滤算法主要包括两个步骤: 2.第一步:找到和目标用户兴趣相似的用户集合。 利用行为的相似度计算兴趣的相似度。给定用户u和用户v,令N(u)表示用户u曾经有过正反馈的物品集合,令N(v)为用户v曾经有过...

jiangdongxiaobawang的博客 1万+

Liskov substitution principle (里氏替換原則)

文章目录背景Tom's Penguin Problem 背景 可替代性是面向对象程序设计中的一项原则,其指出在计算机程序中,如果S是T的子类型,则类型T的对象可以用类型S的对象替换 (即类型T的对象可以用子类型S的任何对象替换 (i.e.向上转型))而不更改程序的任何期望属性(正确性,任务执行等)。 更正式地讲,Liskov替换原理(LSP)是子类型关系的特定定义,称为(强)行为子类型化,最初是由...

Jeff_的博客 848

Emscripten安装(wasm编译)

5:配置对应环境变量--替换成自己对应的安装路径(2025最新的Emscripten工具链默认使用LLVM/WebAssembly标准工作流,java依赖已经移除了,所以以下java环境不配,需要使用java的手动添加即可---->emsdk install java-8-152-64bit。3:下载相应的依赖库---->emsdk install latest(我这里下的是最新的,如果有指定版本,把latest替换成版本号即可)6:测试是否成功---> emcc- v/em++ -v。

qq_31578301的博客 554

Liskov替换原则(Liskov Substitution principle)

子类型(subtype)必须能够替换掉他们的基类型(base type)如果一个类承担的职责过多,就等于把这些职责耦合在了一起。一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的(fragile)设计。当一个职责发生变化时,可能会影响其它的职责。另外,多个职责耦合在一起,会影响复用性。例如:要实现逻辑和界面的分离。...

一朝风月 3259

GD32主程序跑飞?可能是BOOT0引脚惹的祸(附J-LINK调试实录)

本文针对GD32微控制器程序下载后无法运行的典型问题,深入剖析了BOOT0引脚配置对启动模式的关键影响。通过结合J-LINK调试器与KEIL MDK环境,详细演示了如何从程序跑飞现象(如PC指向0x1FFF Fxxx)定位到硬件层面的BOOT0引脚与VDD短路故障,并提供了系统的硬件排查步骤与设计预防建议。

d6e7f8的博客 703

51单片机——LCD12864驱动函数深度解析与实战优化

本文深入解析了51单片机驱动LCD12864液晶屏的核心驱动函数,从底层时序、关键延时到地址计算进行逐行剖析,并针对常见显示问题提供系统性的调试技巧与实战优化方案。重点探讨了如何将基础代码优化为稳定高效的驱动,涵盖延时精准化、批量写入及显示缓冲区等高级技巧,旨在帮助开发者从“点亮”屏幕进阶到“精通”驱动,确保显示稳定可靠。

weixin_29190169的博客 84

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

Liskov替换原则(Liskov Substitution Principle)是一组用于创建继承层次结构的指导原则。按照Liskov替换原则创建的继承层次结构中,客户端代码能够放心的使用它的任意类或子类而不担心所期望的行为。 Liskov替换原则定义 如果S是T的子类型,那么所有的T类型的对象都可以在不破坏程序的情况下被S类型的对象替换。 基类型:客户端引用的类型(T)。子类型可以重写...

weixin_33721344的博客 396

PS/Ai/PR/AE等adobe出现正版弹窗提示:Your non-genuine Adobe app will be disabled soon解决办法

就是用专门的清理工具下载,清理工具在文章下方。然后新建三个空的记事本文件,重命名为 Adobe Genuine Launcher.exe,AdobeGCClient.exe,AGMService.exe。在该文件目录中,分别找到 Adobe Genuine Launcher.exe,AdobeGCClient.exe,AGMService.exe,然后在防火墙入站规则里,阻止Adobe Genuine Launcher.exe,AdobeGCClient.exe,AGMService.exe。

Q82556499的博客 1万+

深入理解设计原则之里氏替换原则(LSP)【软件架构设计】

里氏替换原则(Liskov Substitution Principle, LSP)于1986年有Barbara Liskov提出,他当时是这样描述这条原则的:如果S是T的子类型,那么T的对象可以被S的对象所替换,并不影响代码的运行。1996年,Robert Martin在他的SOLID原则中重新描述了里氏替换原则:使用父类对象的函数可以在不了解子类的情况下替换为使用子类对象。 结合上面的描述,我们将里氏替换原则描述为:子类对象能够替换到程序中的父类对象出现的任何地方,并且保证程序原有的逻辑行为不变和正确性

weixin_30197685的博客 3441

车载测试实战:adb logcat日志高效抓取与问题定位技巧

本文详细介绍了车载测试中adb logcat日志的高效抓取与问题定位技巧。作为车载测试的“第一现场”,adb logcat能实时、精准地抓取系统与应用日志,是定位应用崩溃、ANR及功能异常等问题的关键工具。文章从环境搭建、核心命令组合拳到实战分析与自动化脚本,提供了完整的操作指南,帮助测试人员快速掌握这一必备技能,大幅提升问题排查效率。

ii567的博客 1037

【人脸识别/轻量级模型】MobileFaceNet:适用于人脸识别的轻量级网络模型(文末附pytorch代码)

MobileFaceNet:用于人脸识别的轻量级网络模型

Roaddd的博客 6988

里氏替换原则(Liskov Substitution Principle)

核心内容:继承必须确保超类所拥有的性质在子类中仍然成立,也就是说在继承时,子类中不要去重写父类中已实现的方法.....

Never-Say-Never 1732

RK3588平台开发系列讲解(USB篇)UAC初识

📢本篇将介绍RK3588平台`UAC`的配置使用。

内核笔记 3880

里氏代换原则 Liskov Substitution Principle

里氏代换原则 Liskov Substitution Principle 使得开放-封闭成为可能 继承性的思考和说明 继承包含这样一层含义:父类中已经实现的方法,实际上是在设定规范和契约,虽然它不强制要求所有的子类必须遵循这些契约,但是如果子类对这些已经实现的方法任意修 改,就会对整个继承体系造成破坏。 阅读下面一个程序 package liskov; class A{ public int...

qq_45462042的博客 358

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

The Liskov Substitution Principle

liscov替换原则(The Liskov Substitution Principle) 子类型必须能够替换其基类型 派生类必须能够通过其基类型的接口使用,客户端无需了解二者之间的差异

分析分析的博客 389

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Liskov替换原则(The Liskov Substitution Principle, LSP)

子类型(subtype) 必须能够替换它们的基类型(base type)​。换一个角度来理解,对于继承层次的设计,要求在任何情况下,子类型与基类型都是可以互换的,那么该继承的使用就是合适的,否则就可能出现问题。即子类型不能添加任何基类型没有的附加约束。为了避免子类型针对基类型的行为添加附加的约束(即违背LSP)​,基类型中应该只提供尽量少的必需的行为,而且不针对这些行为进行任何实现。此时,那些基类型往往就是抽象类(行为没有任何实现)​,甚至是接口。

weixin_37711738的博客 1063

LSP:The Liskov Substitution Principle

Subtypes must be substitutable for their base types. 转载于:https://www.cnblogs.com/nanshouyong326/archive/2007/02/05/640521.html

weixin_30364325的博客 79

Liskov Substitution Principle 里氏替换原则

Liskov Substitution Principle 里氏替换原则 简介 定义:如果对每一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有的对象o1都替换成o2时,程序P的行为没有发生变化,那么类型T2是类型T1的子类型, 定义扩展:一个软件实体如果使用一个父类的话,那一定适用于其子类,所有引用父类的地方必须能透明地使用其子类的对象,子类对象能够替代父类对象,而程序逻辑不变。 主要核心思想 强调只和朋友交流,不和陌生人说话 朋友:出现在成员变量、方法的输入、输出

ai_0922的博客 337

源码分析七大设计原则之里氏替换原则(Liskov Substitution Principle)

一、里氏替换原则(Liskov Substitution Principle) 定义:子类型必须能够替换掉它们的父类型。一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,且它察觉不出父类对象和子类对象的区别。也就是说,子类对象可以随时随地的替换父类对象,并且替换完以后,语法不会报错,业务逻辑不会出现问题。 只有当子类可以替换掉父类,软件功能不受影响时,父类才能真正被复用,而子类也能够在父类的基础上增加新的行为,正是有里氏代换原则,使得继承复用成为了可能。也正是由于子类型的可替换性才使得使用父类类型

用善良的眼光看世界 427

LSP The The Liskov Substitution Principle

转载: http://blog.youkuaiyun.com/robinvane/ LSP The The Liskov Substitution PrincipleOCP原则背后的主要机制是抽象和多态。支持抽象和多态的关键机制是继承。 LSP的定义若对于每一个类型P的对象p1,都存在一个类型C的对象c1,使得在所有针对C编写的程序P中,用p1替换c1后,程序P的行为功能不变,则C是P的子类型。LSP

sophia_sy的专栏 943

Java-Liskov Substitution Principle

Liskov Substitution Principle It formally states that -the preconditions of a subclass’s behaviour (methods) cannot be strengthened, meaning (among other things) that a sub-method cannot accept a narrower range of inputs than the original method. -The post

Nick_kn的博客 298

里士替换原则 (Liskov Substitution Principle)

1. 保证基类所拥有的性质在子类中仍然成立 2. 子类扩展父类的功能,但是不能改变父类原有的功能

m0_51176516的博客 1010

里氏替换原则(Liskov Substitution principle)

在软件设计、编码过程中有几个基本原则即SOLID原则,学习理解能够帮忙我们写出更健壮的代码。SOLID是五个基本原则的首字母。这五个原则如下: Single responsibility Open–closed Liskov substitution Interface segregation Dependency inversion 此篇来学习一下里氏替换原则(Liskov Substitution responsibility) 那么什么是里氏替换原则(LSP)呢? Barb.

一斗水的专栏 1333
上一篇: Liskov Substitution Principle
下一篇: Design Pattern -- Decorator
dr2tr
博客等级 码龄24年 28粉丝 133原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值