金年会

每日经济新闻
要闻

每经网首页 > 要闻 > 正文

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

陈健春 2025-11-02 12:12:16

每经编辑|阿扎尔    

当地时间2025-11-02,,17c磨豆腐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

多态带来的好处是(shi)显而易见的(de):

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

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

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

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

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

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

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

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

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

2025-11-02,人妻连裤袜的故事,南极电商(002127)2025年中报简析:净利润同比下降82.52%,三费占比上升明显

1.大雄与静香一起生猴子漫画,王兴兴:最快一两年就能达到机器人的ChatGPT时刻黄色软件大全油管AGG,四年关闭超一万家!数字化浪潮下,保险线下网点迎来“关门潮”

图片来源:每经记者 钟定损 摄

2.lutube最佳线路+少女b站哔哩视频播放量2023,山东钢铁,扭亏为盈!

3.校霸坐在学霸的鸡上背单词谢俞+巨睾精子浴AV,荷兰兄弟公司CEO称公司处于“增长模式”,星巴克转型加剧饮品行业竞争

糖心logo欲梦子o入口观看+天美mv麻花mv星空mv,万咖壹联9月4日斥资99万港元回购100万股

原神同人漫画-最右

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

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

读者热线:4008890008

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

欢迎关注每日经济新闻APP

每经经济新闻官方APP

0

0

Sitemap