金年会

每日经济新闻
要闻

每经网首页 > 要闻 > 正文

里氏替换与多态有何区别lsp点这个,出发了-csdn博客

陈光远 2025-11-02 22:34:24

每经编辑|闻霄    

当地时间2025-11-02,,SLG神秘邮件部长的秘密游戏

里氏替换原则:继承(cheng)的“忠诚度”考验

想象一下,你精心搭建了一个精密的积(ji)木(mu)王国,每一个积木块都代表一个类。继承,就像是给积木块赋予了“血统”,让子类继承父(fu)类的优点(dian)。但如果有一天,你发现一个本应乖乖待在原位的积木(mu)块,因为(wei)被“继承”了某种“特(te)性”,结(jie)果不(bu)小心(xin)推倒了整个王(wang)国,那可就麻烦了!里氏替换原则(LiskovSubstitutionPrinciple,简称LSP)正是为了避免这种“坑爹”的继承而诞生的。

简单来说,里氏替换原则就是:“任何父类可以被其子类替换,并且程序逻辑不受影响。”这(zhe)句话听起来似乎很(hen)简单,但它对我们设计继承关系有着深远的影响(xiang)。它要求我们在设计继承时,必须保证子类不仅继承了父类的“形态”(属性和方法),更继承了父类的“神”(行为和约束)。

子类不能随意“叛变”,做出与父类行为相悖的(de)事情。

举个例子,我们有一(yi)个“鸟”的父类,它有一个fly()方法。如果我们设计一个“企鹅”类继承“鸟”类(lei),并让“企鹅”也拥有fly()方法,那问题就来了。企鹅不会飞!如果我们的程序中有这样一个逻辑:“让所有鸟类飞起来”,那么当遇到企鹅时,就会出现运行时错误,或者产生预料之外的行为。

这就是违反了里氏替换原则。

如何才能遵循里氏替(ti)换原(yuan)则呢?

设计清晰的父类契约。父类应该定义清晰(xi)的、可预期的行为规范。例如,“鸟”类(lei)可以定义“会移动”和“会发声”等通用行为,但fly()方法可能就需(xu)要更谨慎地处理,或者根本(ben)不应该放(fang)在“鸟”这个(ge)过于宽泛的父类中。

子类实现父类的行为时,必须(xu)尊重父类的约束。这意(yi)味着子类在重写父(fu)类方法时,不能比父类的方法更严格,也不能比父类的方法更宽松。例如,如果父类方法要求传入一个非负整数,子类方法就(jiu)不能(neng)接受负整数。如果父类方法保证不会抛出特定的异常,子类重写该方法时也不能(neng)抛出这个异常。

再者,避免在(zai)子类中添加(jia)不兼容的方法。如果子类需要增加新的功能,最(zui)好通过组合(Composition)而不是继承来实现,或者为这(zhe)些新功能设计新的(de)方法,而不是覆盖父类中已有的(de)、行为不兼容的(de)方法。

遵循里氏替换原则,能够极大地增强我们代码的可维护性和健壮性。当我们(men)看到一个(ge)父类引用指向一个子类对象时,我们可以自信(xin)地认为,无论这个对象是父类的实例还是任何一(yi)个遵循LSP的子类实例,它(ta)的行为都是可以预测的,我们的代码不会因为“换了个马甲”就出问题。

这就像是给你的代码上了“保险”,让它在面对未来需求变化时,少一些“惊吓”,多一些“惊喜”。

里(li)氏替换原则,是(shi)继承这条路(lu)上的“交通规(gui)则”。它不是限制我们发挥创意,而是(shi)引导我们建立更稳固、更可靠的“家族体系”。有了它,继承(cheng)才(cai)能真正成为(wei)代码复(fu)用的利器,而不是隐藏的“定时炸弹”。

多态:代码的“变形金刚”艺术

如果说里氏替换原则是确保继承关系的“忠诚”,那么多态(Polymorphism)就是让这些“忠诚”的继承者们施展“十八般武艺”的舞台。多态,顾名思义,就是“多种形态”。在面向对象编程中,它指的是允许使用父类类型的引用来(lai)指向子类对象,并(bing)且在运行时能够根据对象的实际类型调用相应(ying)的方法。

想象一下,你(ni)有一个遥控器,这个遥控(kong)器可以控制不同(tong)种类的电器(qi)。你按下“开关”按钮,如果是电(dian)视,它就打开(kai)屏幕;如果是音响,它就播放音乐。遥控(kong)器本身只需要知道“有开关”这个功能,而不需要关(guan)心具体是哪种电器。这就是多(duo)态的(de)魅力。

多态的核心在于“动态绑定”或“运(yun)行时绑(bang)定”。在(zai)程序编(bian)译时,我们可能只知道一个变量的类(lei)型是父类,但它实际指向的对象可能是父类(lei)本身(shen),也可能是它的某个子类。直到程序运行时,JVM(Java虚拟机(ji))或者CLR(.NET公共语言运行(xing)库)等运(yun)行时环境,才会根据变量实际引(yin)用的对象类型,去查找并调用真正应该执行的方法(fa)。

多态带来的好处是显而易见的:

1.降低代码耦合度,提高灵活性:通过多态,我们可以编写更加(jia)通用(yong)的代码。比如,一个处理“动物”的函数,可(ke)以接(jie)收任何继承自“动物”的子(zi)类对象(如“猫”、“狗”),并调用(yong)它们的makeSound()方法,而不需要知道(dao)具体的动物(wu)种类。这样,当我们添加新的动物类型时,原有的处(chu)理函数无需修改,就能自动适应新的(de)类(lei)型。

2.增强代码的可扩展性:新增子类(lei)不会影响现有代码的运行,因为现有代码是通过父类接口或抽象类进行交互的(de)。这使得系统更容易扩展,也(ye)更容(rong)易维护。

3.实现代码(ma)的简洁和优雅:省去了大量的if-else或switch-case语(yu)句来判断对象类型,让代(dai)码更加清(qing)晰、简洁,读起来也更顺畅。

多态的实现方式主要有(you)几种:

方法重写(Overriding):子类继承父类后,对父(fu)类中已经定义好的方法进行重(zhong)新实现。这是实现运行时多态最常见的方式(shi)。接口(Interface):接口定义了一组方法签名,但不提供实现。不同的类可以实现同一(yi)个接口,并各自提供方(fang)法的具体实现。

通过接口引用指向实(shi)现该接(jie)口的对象,也能实现多态。抽象类(AbstractClass):抽象类可以包含抽象方法(没有实现)和具体方(fang)法。子类继承抽象类后,必须实现其所有抽象方法。

里氏替换原则和(he)多态(tai),二者相辅相成,缺一不可。里氏替换原则为多态的实现提供了(le)前提条件:只有当(dang)子类能够无缝地替换父类时,我们才能放心地通过父类引用来调用子类的方法,而不会出(chu)现意外。可以说,里氏替换原则是“静态”的规则,它指导我们如何设计正确的继承关系;而多态则是“动态”的体现,它让这(zhe)种正确的继(ji)承关系在运行时焕发活力。

当我们(men)将里氏替换原则和多态结合起来应用时,我(wo)们的代码就能实现真正的“形神合一”。对象的“形”(具体类型(xing))虽然可以变化,但其(qi)“神”(行为和约定)却始终(zhong)遵(zun)循着父类的规范。这使得我们的程序不仅易于理解,而且具有强大(da)的生命力(li),能够轻松应对未来的(de)各种(zhong)挑战。

所以,下次当你考虑继承时,不妨多问一句:我的子类真的能够“忠诚”地扮演父类的角色吗?也要积极拥抱多态,让你的代码像一位技艺精湛的演员,能够根据角色需求,灵活地演绎出最精彩的“多种形态”!

2025-11-02,swag网页,韩国半导体7月份出口额增至147.2亿美元 同比大增31.2%但环比略有下滑

1.瘦子探花视频长久在线观看,欧盟拟推进第19轮对俄制裁,瞄准支付和加密领域!火辣辣App大全在线导航,龙佰集团回购156万股 成交金额2548万元

图片来源:每经记者 陈锟 摄

2.黄色网站3.0.3+日本国产白虎视频,大宗商品综述:原油、黄金和铜均走高 市场焦点转向鲍威尔讲话

3.黄色小视频下载+三叶草欧洲码在线,振华重工:公司将加快建设港机现代产业体系

japanese18日本护士+超碰色人格,华夏基金:非法证券期货活动介绍 五问五答

昨日国家机构透露研究成果日本大但人文艺术与希腊文化的跨界共鸣

封面图片来源:图片来源:每经记者 名称 摄

如需转载请与《每日经济新闻》报社联系。
未经《每日经济新闻》报社授权,严禁转载或镜像,违者必究。

读者热线:4008890008

特别提醒:如果我们使用了您的图片,请作者与本站联系索取稿酬。如您不希望作品出现在本站,可联系金年会要求撤下您的作品。

欢迎关注每日经济新闻APP

每经经济新闻官方APP

0

0

Sitemap