在 Typescript 和 Java 中应用“里氏替换原则”

在 typescript 和 java 中应用“里氏替换原则”

概念

接口

接口定义类必须实现的契约或一组方法和属性。接口用于确保类遵循某种格式,但它们不提供方法的实现,仅提供方法的签名。

每当一个类实现一个接口时,它就会签署该接口的所有契约(方法和属性)。每个属性和方法都是强制实现的。

坚硬的

solid 是一个缩写词,代表面向对象编程的五个基本原则,由 robert c. martin(鲍勃大叔)提出。在这里您可以阅读有关他的文章的更多信息。
这些原则旨在改进代码的结构和维护,使其更加灵活、可扩展且更易于理解。这些原则可以帮助程序员创建更有组织的代码、划分职责、减少依赖、简化重构过程并促进代码重用。

关于lsp

缩写中的“l”代表“里氏替换原理”。 bob叔叔用来定义这个原则的一句话是:

“派生类必须能够完全替换基类”

因此建议派生类应该尽可能接近基类,这样派生类就可以在代码不做任何修改的情况下替换其基类。

该原则由 barbara liskov 于 1988 年基于数据抽象和类型理论提出。源自契约式设计 (dbc) 的概念,由 bertrand meyer 于 1986 年推广。

这一原则的另一个具体说明是:

子类型应该用作您的基本类型,没有任何意外。

在编程中,变化和意外可能会导致问题。如果需要更换某项系统功能,新功能必须提供相同类型的信息,否则系统可能会出现故障。为了确保类 s 具有与基类 t 相同的行为,必须使用定义实现新功能的强制方法的契约(接口或抽象类),以保证类 s 之间相似性的完整性和 t 类。

实际应用

考虑一个带有 fly() 方法的 bird 基类,该方法将在两个子类中使用:sparrow 和 ostrich。

立即学习“Java免费学习笔记(深入)”;

文件:bird.java

class bird {    void fly() {        system.out.println("i can fly!");    }}class sparrow extends bird {    // herda o comportamento de 'fly' da classe 'bird'}class ostrich extends bird {    @override    void fly() {        throw new unsupportedoperationexception("i cannot fly");    }}

文件:bird.ts

class bird {  fly() {    console.log("i can fly!");  }}class sparrow extends bird {}class ostrich extends bird {  fly() {    throw new error("i cannot fly");  }}

遇到的问题

在这里,sparrow 类遵循 lsp,因为麻雀确实可以飞。然而,ostrich 类违反了 lsp,因为它以从根本上改变其行为的方式重写了 fly() 方法,打破了 bird 类设定的期望。

阿里妈妈·创意中心 阿里妈妈·创意中心

阿里妈妈营销创意中心

阿里妈妈·创意中心 0 查看详情 阿里妈妈·创意中心

如何修复?

我们需要通过将 sparrow 和 ostrich 类的每个特殊性划分为合约(接口或抽象类,这里我将使用接口)来应用 lsp,它们必须签署这些合约来调整每个类的行为:

文件:bird.java

interface bird {    string getname();    void makesound();}interface flyingbird extends bird {    void fly();}class sparrow implements flyingbird {    private string name;    public sparrow(string name) {        this.name = name;    }    @override    public string getname() {        return this.name;    }    @override    public void makesound() {        system.out.println("chirp chirp!");    }    @override    public void fly() {        system.out.println(this.name + " is flying!");    }}class ostrich implements bird {    private string name;    public ostrich(string name) {        this.name = name;    }    @override    public string getname() {        return this.name;    }    @override    public void makesound() {        system.out.println("boom boom!");    }}public class main {    public static void main(string[] args) {        sparrow sparrow = new sparrow("little sparrow");        sparrow.makesound(); // chirp chirp!        sparrow.fly(); // little sparrow is flying!        ostrich ostrich = new ostrich("ostrich");        ostrich.makesound(); // boom boom!        ostrich.fly(); // error: method 'fly' does not exist on 'ostrich'    }}

文件:bird.ts

interface Bird {  name: string;  makeSound(): void;}interface FlyingBird extends Bird {  fly(): void;}class Sparrow implements FlyingBird {  name: string;  constructor(name: string) {    this.name = name;  }  makeSound() {    console.log("Chirp chirp!");  }  fly() {    console.log(`${this.name} is flying!`);  }}class Ostrich implements Bird {  name: string;  constructor(name: string) {    this.name = name;  }  makeSound() {    console.log("Boom boom!");  }}const sparrow = new Sparrow("Little Sparrow");sparrow.makeSound(); // Chirp chirp!sparrow.fly(); // Little Sparrow is flying!const ostrich = new Ostrich("Ostrich");ostrich.makeSound(); // Boom boom!ostrich.fly(); // Error: Method 'fly' does not exist on 'Ostrich'

分析

更正说明
bird interface:定义所有鸟类共有的行为,例如makesound()。所有鸟类都必须实现此接口。

flyingbird 接口:继承自 bird 并添加 fly() 行为,该行为针对会飞的鸟类。

sparrow 类:实现 flyingbird 接口,因为麻雀可以飞。此类定义了发出声音和飞行的行为。

鸵鸟类:仅实现 bird 接口,因为鸵鸟不会飞。该类没有 fly() 方法,因此不违反 lsp。

结论

lsp 对于确保代码模块化、可重用且易于维护至关重要。 lsp 违规可能会导致脆弱的代码在引入新子类或修改现有子类时中断,因为这可能会导致依赖于超类的部分代码出现意外行为。

子类型替换允许模块无需修改即可扩展,这对于开闭原则 (ocp) 提供的灵活性至关重要,而里氏替换原则使之成为可能。契约(通过接口或抽象类实现)对于安全设计至关重要,但程序员必须充分理解它们,有助于避免遗留软件中的常见错误。他们还提供了有关如何实施和使用代码的宝贵指导,只需遵守相关合同即可。

实际意义

设计子类时,确保它们可以在使用其超类的任何地方使用,而不会引入错误或需要特殊处理。避免创建违反超类预期行为的子类,因为这可能会导致维护问题和意外错误。

理解和应用里氏替换原则可以帮助开发人员创建更加可预测和稳定的面向对象系统。

以上就是在 Typescript 和 Java 中应用“里氏替换原则”的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/483200.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
谷歌浏览器书签不见了怎么解决?
上一篇 2025年11月8日 12:19:40
拼多多过期的优惠券还能恢复吗?过期优惠券在哪儿查看?「紧急抢救」拼多多过期优惠券竟有“复活”秘诀?失效记录全攻略曝光!
下一篇 2025年11月8日 12:19:44

相关推荐

  • 红米Turbo 3怎么无视风险安装软件?

    php小编鱼仔红米Turbo 3发布,吸引了众多用户关注。这款无视风险的安装软件提供了令人印象深刻的功能。其简洁易用的界面、强大的性能和安全性备受赞誉。无论是游戏、工作还是娱乐,Turbo 3都能为用户提供流畅的体验。 红米Turbo 3怎么无视风险安装软件? 打开手机的“设置”应用。 在设置菜单中…

    2026年8月28日
    100
  • Laravel应用常见安全威胁和防护措施

    laravel应用中常见的安全威胁包括sql注入、跨站脚本攻击(xss)、跨站请求伪造(csrf)和文件上传漏洞。防护措施包括:1. 使用eloquent orm和query builder进行参数化查询,避免sql注入。2. 对用户输入进行验证和过滤,确保输出安全,防止xss攻击。3. 在表单和a…

    2026年8月27日
    100
  • 如何在ThinkPHP中实现请求(Request)参数过滤?

    在thinkphp中,可以通过全局过滤器、自定义验证器和中间件高效地实现请求参数过滤。1. 全局过滤器在apphttpmiddleware.php中添加,适用于所有请求的统一处理。2. 自定义验证器在appvalidate目录下创建,适合针对特定模型进行细致验证。3. 中间件在appmiddlewa…

    2026年8月27日
    100
  • 《严阵以待》主机版销量超100万套 仅用了4天时间

    开发商void interactive在领英页面上透露,其推出的战术射击游戏《严阵以待》主机版(涵盖ps5与xbox series平台)在发售四天内销量突破100万份。 《严阵以待》最早于2021年在Steam平台开启抢先体验阶段,并于2023年12月正式登陆Steam发售。游戏中,玩家将化身名为“…

    2026年8月27日
    000
  • 红米Note13RPro怎么取消自动扣费?

    红米Note13RPro怎么取消自动扣费?红米Note13RPro怎么取消自动扣费?红米Note13RPro怎么取消自动扣费?红米Note13RPro怎么取消自动扣费?

    问题:红米note 13r pro手机上自动扣费功能如何取消?简单说明:很多消费场景会自动开通自动扣费功能,导致用户不知情的情况下扣费。引导阅读:本教程将详细介绍红米note 13r pro手机上取消自动扣费的步骤, giúp php小编草莓大家管理好自己的每一笔消费,避免不必要的开支。 红米Not…

    2026年8月26日 用户投稿
    100
  • 红米Note13RPro怎么拍月亮?

    如果你拥有红米note13rpro,是否好奇如何捕捉令人惊叹的月亮照片?这篇文章将指导你逐步了解红米note13rpro的强大摄影功能,让你轻松拍摄出清晰明亮的月亮特写。php小编子墨已精心整理了实用技巧,帮助你掌握月亮摄影的诀窍。 红米Note13RPro怎么拍月亮? 1、点击“相机”。 2、在拍…

    2026年8月26日
    000
  • 红米Note13RPro怎么应用分身?

    如何使用红米note13 pro的应用分身功能红米note13 pro智能手机配备了一系列实用功能,其中包括应用分身功能。此功能允许用户创建两个具有独立数据的应用程序副本,从而同时使用同一应用程序的不同帐户。如果你热衷于探索红米note13 pro的应用分身功能,请继续阅读本指南。php小编小新将逐…

    2026年8月26日
    000
  • 表单数据验证与过滤的最佳实践

    我们需要重视表单数据的验证和过滤,以确保应用的安全性和数据的完整性。1) 结合使用客户端和服务器端验证,客户端提供即时反馈,服务器端确保数据安全。2) 验证不同类型的数据,如字符串、数字、日期,确保格式和业务逻辑正确。3) 处理错误时提供友好的错误信息,并防止泄露敏感信息。4) 使用适当的函数过滤数…

    2026年8月26日
    000
  • 红米Note13RPro怎么唤醒小爱同学?

    在 redmi note 13r pro 智能手机上,小爱同学语音助手的便捷使用备受关注。想知道如何轻松唤醒小爱同学吗?阅读php小编百草为您带来的详细指南,了解简单易行的语音唤醒步骤,让您的手机操作更便捷。 红米Note13RPro怎么唤醒小爱同学? 1、打开手机设置,点击小爱同学。 2、选择语音…

    2026年8月25日
    100
  • 红米Note13RPro怎么更换手机铃声?

    红米Note13RPro怎么更换手机铃声?红米Note13RPro怎么更换手机铃声?红米Note13RPro怎么更换手机铃声?红米Note13RPro怎么更换手机铃声?

    换铃声,打造专属来电惊喜想要为每一通来电增添惊喜吗?铃声更换至关重要。红米note13rpro贴心提供了便捷的更换方法,让你的来电瞬间充满个性。php小编香蕉这就来为你详细介绍红米note13rpro的换铃声秘籍。如果你还对如何更换铃声一无所知,那就快来学习一下吧! 红米Note13RPro怎么更换…

    2026年8月25日 用户投稿
    000
  • 红米Note13RPro怎么设置一键锁屏?

    红米Note13RPro怎么设置一键锁屏?红米Note13RPro怎么设置一键锁屏?红米Note13RPro怎么设置一键锁屏?红米Note13RPro怎么设置一键锁屏?

    一键锁屏功能的大有可为红米note13rpro凭借其出色的功能,始终引领着智能手机行业的发展。其中,一键锁屏功能因其极大方便和高效护私而备受关注。如果你还在为如何快速锁屏而烦恼,那么这篇文章将为你揭晓红米note13rpro一键锁屏功能的秘诀。php小编柚子将一步一步指导你如何使用此功能,让你轻松保…

    2026年8月25日 用户投稿
    100
  • 红米Note13RPro怎么关闭后台程序?

    长时间使用红米note13rpro手机后,会逐渐产生系统垃圾,影响手机性能。因此,关闭后台程序至关重要。php小编新一将在下文详细介绍如何关闭红米note13rpro的后台程序,帮助您优化手机性能,畅享流畅的使用体验。 红米Note13RPro怎么关闭后台程序? 1、在手机桌面上长按左侧菜单键; 2…

    2026年8月25日
    300
  • 使用 element-ui Table 组件合并单元格时,最后一行高度异常该如何解决?

    element-ui table 组件合并单元格导致最后一行高度异常的解决之道 在 element-ui 的表格组件中,利用 objectspanmethod 用于合并单元格。但是,在合并过程中,用户遇到了最后一行高度异常的问题,导致其高度远高于其他行。 问题分析 根据用户提供的代码示例,在合并第 …

    2025年12月24日
    100
  • Element-UI Table 合并单元格导致最后一行高度异常如何解决?

    element-ui table 合并单元格导致最后一行高度异常的解决方法 使用 element-ui 的 table 组件时,对某些列进行合并单元格可能会在最后一行引起异常高度问题。例如,在合并最后一列的情况下,最后一行的文本可能会超出边界。 出现这种情况的原因是: 在对合并行进行样式设置时,使用…

    2025年12月24日
    700
  • Element UI 表格合并单元格最后一行高度异常如何解决?

    element ui 表格合并单元格最后一行高度异常问题 element ui 表格使用 rowspan 属性合并单元格时,最后一行的高度可能出现比其他行高的异常情况。 原因: element ui 表格合并单元格时,需要通过 objectspanmethod 方法指定合并单元格的起始行和结束行,而…

    2025年12月24日
    000
  • Element-UI Table 合并单元格时,最后一行高度异常的原因是什么?

    element-ui table 合并单元格时最后一行高度异常 在使用 element-ui 中的 table 组件时,若对最后一列进行合并单元格操作,可能会遇到最后一行高度异常的情况,表现为高度比其他行高出许多。 出现此异常的原因在于合并单元格的代码配置中起始行数写错。具体来说,在使用 objec…

    2025年12月24日
    100
  • ⏰ 你的声音很重要 – CSS 调查现已开放!

    嘿? 本周五,Sprintfolio 将举办Designer + Dev Mixer。我正计划参加并且对此感到非常兴奋! 这将是与设计师和开发人员建立联系、交流见解并促进集体成长的绝佳机会。 我强烈推荐加入 – 完全免费!谁有兴趣? – 注册 享受 ? – Ada…

    2025年12月24日
    500
  • html表格标题如何写_编写HTML表格标题的正确标签【正确】

    HTML表格标题必须使用语义化的标签,置于内且在等元素之前;禁用–等非语义标签替代;可通过CSS的caption-side和text-align调整位置与对齐。 如果您在编写HTML表格时发现标题显示不正确或未被识别,则可能是由于使用了错误的标签或未遵循标准语义结构。以下是编写HTML表格标题的正确…

    2025年12月23日
    400
  • html5表格怎么建立_HT5用table加tr/td/th标签建立行列数据表格【建立】

    HTML5中构建表格最基础方式是使用table、tr、td、th标签;需添加caption语义化标题,并推荐用thead/tbody/tfoot划分逻辑区域,配合colspan/rowspan实现合并,再通过CSS设置边框与样式。 如果您需要在网页中展示结构化的行列数据,HTML5 中最基础且常用的…

    2025年12月23日
    100
  • html5怎么添加表格_html5用table标签加tr/td/th添加行列数据表格【添加】

    HTML5用创建结构化表格,含定义行列,支持边框样式、rowspan/colspan跨格、标题及/分区,并可通过外层实现响应式滚动。 如果您希望在网页中展示结构化数据,HTML5 提供了原生的 标签来创建表格。以下是使用 、 、 和 标签添加行列数据表格的具体方法: 一、基础表格结构搭建 表格由 元…

    2025年12月23日
    300

发表回复

登录后才能评论
关注微信