陈凤学 2025-11-02 00:55:25
每经编辑|陈艳艳
当地时间2025-11-02,gfyuweutrbhedguifhkstebtj,日本护士体内she精4
想象一下(xia),你精(jing)心搭(da)建(jian)了(le)一个精密(mi)的积(ji)木王国,每一个(ge)积木块(kuai)都(dou)代表一(yi)个类(lei)。继承,就(jiu)像(xiang)是(shi)给(gei)积(ji)木块(kuai)赋予(yu)了“血(xue)统(tong)”,让(rang)子(zi)类(lei)继(ji)承父类(lei)的优(you)点(dian)。但(dan)如果(guo)有(you)一天,你(ni)发(fa)现一个(ge)本应乖乖(guai)待在原(yuan)位(wei)的积(ji)木块,因为被“继(ji)承”了某种(zhong)“特性(xing)”,结果(guo)不(bu)小心推(tui)倒了整(zheng)个王国(guo),那可就麻(ma)烦了(le)!里(li)氏(shi)替(ti)换(huan)原(yuan)则(ze)(LiskovSubstitutionPrinciple,简(jian)称(cheng)LSP)正是(shi)为(wei)了(le)避免这种(zhong)“坑爹(die)”的继承而诞生(sheng)的(de)。
简单来(lai)说,里(li)氏(shi)替(ti)换原则(ze)就(jiu)是(shi):“任何父(fu)类可(ke)以被其(qi)子(zi)类替(ti)换,并(bing)且(qie)程序逻(luo)辑不受影响(xiang)。”这(zhe)句话(hua)听起(qi)来(lai)似(shi)乎很简(jian)单(dan),但它(ta)对我(wo)们(men)设计继(ji)承(cheng)关系有着(zhe)深(shen)远(yuan)的影响。它要(yao)求我们在设计(ji)继承(cheng)时,必(bi)须保(bao)证子(zi)类不仅继承了(le)父(fu)类的“形(xing)态(tai)”(属性和方法(fa)),更(geng)继(ji)承了父类(lei)的“神”(行为和(he)约(yue)束)。
举个例(li)子,我(wo)们(men)有(you)一(yi)个(ge)“鸟”的(de)父类,它有(you)一个(ge)fly()方法。如(ru)果(guo)我(wo)们(men)设计一(yi)个(ge)“企鹅”类继(ji)承(cheng)“鸟”类,并(bing)让“企(qi)鹅”也拥有fly()方(fang)法(fa),那问题(ti)就来了。企(qi)鹅(e)不(bu)会(hui)飞!如果我(wo)们的(de)程(cheng)序中有(you)这样一个(ge)逻辑(ji):“让所有鸟类(lei)飞(fei)起来”,那(na)么(me)当(dang)遇(yu)到(dao)企鹅(e)时,就会(hui)出现运(yun)行时(shi)错(cuo)误(wu),或者产生(sheng)预(yu)料之外的行为(wei)。
设(she)计清晰的父类契约。父类应该定义(yi)清(qing)晰(xi)的、可预期的行(xing)为规范(fan)。例(li)如,“鸟(niao)”类可以定义“会(hui)移(yi)动(dong)”和“会(hui)发(fa)声(sheng)”等通(tong)用行(xing)为,但fly()方法可能(neng)就需(xu)要(yao)更(geng)谨慎地处理,或(huo)者(zhe)根本(ben)不(bu)应该(gai)放在(zai)“鸟”这个过(guo)于宽泛的(de)父类(lei)中(zhong)。
子类实(shi)现父(fu)类的行(xing)为时,必须(xu)尊重父类的(de)约(yue)束。这意(yi)味(wei)着(zhe)子类(lei)在重(zhong)写父类方法时(shi),不能比(bi)父(fu)类的(de)方法(fa)更严(yan)格(ge),也不能(neng)比父类(lei)的方法(fa)更宽松。例(li)如,如果父(fu)类方法要(yao)求传(chuan)入一(yi)个非负(fu)整数,子(zi)类(lei)方法(fa)就(jiu)不能(neng)接(jie)受(shou)负(fu)整(zheng)数(shu)。如(ru)果父类方法保(bao)证不会(hui)抛出特(te)定的(de)异常,子类(lei)重写(xie)该方(fang)法时(shi)也不(bu)能抛(pao)出这(zhe)个异(yi)常。
再(zai)者,避免在(zai)子(zi)类(lei)中添(tian)加不(bu)兼(jian)容(rong)的方(fang)法。如(ru)果子(zi)类需要增加新的功(gong)能,最(zui)好通过组(zu)合(Composition)而(er)不是继承(cheng)来(lai)实(shi)现,或者(zhe)为(wei)这些新功能(neng)设(she)计新的(de)方(fang)法,而(er)不是覆(fu)盖(gai)父(fu)类(lei)中已(yi)有的(de)、行(xing)为(wei)不(bu)兼容的(de)方(fang)法。
遵循(xun)里(li)氏替(ti)换(huan)原(yuan)则,能够极大(da)地增(zeng)强(qiang)我们代(dai)码的(de)可(ke)维(wei)护(hu)性(xing)和(he)健壮(zhuang)性。当(dang)我(wo)们看(kan)到一(yi)个父类引用指向一(yi)个子类(lei)对象时(shi),我(wo)们(men)可以自信(xin)地认(ren)为,无论这个对(dui)象(xiang)是(shi)父类(lei)的实例还(hai)是任(ren)何一(yi)个遵循LSP的(de)子(zi)类实例(li),它的行为(wei)都是可以(yi)预测的(de),我们(men)的(de)代码不(bu)会(hui)因为(wei)“换了个马(ma)甲(jia)”就出(chu)问题(ti)。
这(zhe)就像(xiang)是给你(ni)的代码(ma)上了(le)“保(bao)险”,让它(ta)在面对未来需(xu)求变化(hua)时(shi),少(shao)一些(xie)“惊吓”,多(duo)一些“惊喜(xi)”。
里氏(shi)替换(huan)原则(ze),是继(ji)承这条路(lu)上的“交通(tong)规(gui)则”。它不(bu)是限制我们发挥创(chuang)意,而(er)是引(yin)导我(wo)们建(jian)立更稳(wen)固(gu)、更可靠的(de)“家族体系”。有(you)了它(ta),继(ji)承才能(neng)真正(zheng)成(cheng)为代(dai)码(ma)复(fu)用(yong)的利器(qi),而不是隐藏(cang)的“定时炸弹(dan)”。
如(ru)果(guo)说里(li)氏替换(huan)原则是确(que)保继(ji)承(cheng)关(guan)系的“忠诚(cheng)”,那么多态(tai)(Polymorphism)就是(shi)让这些“忠诚(cheng)”的(de)继承(cheng)者(zhe)们(men)施展(zhan)“十八般武(wu)艺”的(de)舞台(tai)。多(duo)态,顾名(ming)思(si)义(yi),就(jiu)是“多(duo)种形态(tai)”。在面向对(dui)象编程中(zhong),它(ta)指的是(shi)允许(xu)使用(yong)父(fu)类(lei)类型的引(yin)用来(lai)指向子(zi)类(lei)对象,并且(qie)在运(yun)行时(shi)能(neng)够根据(ju)对象(xiang)的实(shi)际(ji)类(lei)型(xing)调(diao)用(yong)相应(ying)的(de)方法。
想(xiang)象一(yi)下,你有一(yi)个遥控(kong)器(qi),这(zhe)个遥(yao)控器可以(yi)控制不同(tong)种类的电器。你(ni)按下(xia)“开(kai)关”按钮(niu),如果是(shi)电(dian)视,它(ta)就打开屏幕;如(ru)果是(shi)音响,它就(jiu)播放(fang)音乐(le)。遥控(kong)器本身(shen)只需要知道(dao)“有开(kai)关(guan)”这(zhe)个功能,而不需(xu)要关(guan)心具(ju)体是(shi)哪(na)种电器。这就(jiu)是多(duo)态的(de)魅力(li)。
多(duo)态的核(he)心在于“动态(tai)绑(bang)定”或(huo)“运行时绑(bang)定(ding)”。在(zai)程(cheng)序编译时,我(wo)们可能只知(zhi)道一(yi)个(ge)变(bian)量的(de)类(lei)型是父类(lei),但它(ta)实(shi)际(ji)指向的对(dui)象(xiang)可(ke)能是(shi)父类(lei)本身,也(ye)可能是(shi)它的(de)某个(ge)子类。直到(dao)程(cheng)序运行(xing)时,JVM(Java虚(xu)拟机(ji))或者(zhe)CLR(.NET公共语(yu)言运行(xing)库)等运(yun)行(xing)时环境,才(cai)会(hui)根据变量实(shi)际(ji)引用的(de)对象类(lei)型(xing),去查(cha)找并调用真正(zheng)应该(gai)执行(xing)的(de)方(fang)法。
1.降低(di)代码(ma)耦合度,提高灵(ling)活性:通过(guo)多(duo)态(tai),我们(men)可以编写(xie)更加通(tong)用(yong)的(de)代(dai)码。比如,一个处(chu)理“动(dong)物”的函数(shu),可以接(jie)收(shou)任何(he)继承自(zi)“动(dong)物”的(de)子类(lei)对象(xiang)(如“猫(mao)”、“狗”),并调用(yong)它们(men)的makeSound()方法(fa),而不需(xu)要(yao)知道(dao)具体(ti)的(de)动物(wu)种类(lei)。这(zhe)样(yang),当我们(men)添加新的动(dong)物类型时(shi),原(yuan)有的处理函数无(wu)需(xu)修改(gai),就(jiu)能自动(dong)适应新的类型。
2.增(zeng)强(qiang)代(dai)码的(de)可(ke)扩展性:新(xin)增(zeng)子类(lei)不(bu)会(hui)影响(xiang)现有(you)代码(ma)的(de)运(yun)行,因为现有代(dai)码(ma)是通过父类(lei)接口或抽(chou)象类进(jin)行交互(hu)的。这使(shi)得系(xi)统(tong)更容易扩(kuo)展,也更容易(yi)维(wei)护。
3.实(shi)现代(dai)码(ma)的简洁和(he)优雅(ya):省(sheng)去了(le)大量的(de)if-else或switch-case语(yu)句(ju)来判(pan)断(duan)对(dui)象类型,让代码更加(jia)清晰(xi)、简洁,读(du)起来也(ye)更顺(shun)畅(chang)。
方(fang)法重(zhong)写(Overriding):子(zi)类继承父类(lei)后(hou),对父类中已经(jing)定义(yi)好的(de)方法(fa)进(jin)行(xing)重(zhong)新(xin)实现(xian)。这是(shi)实现(xian)运(yun)行(xing)时(shi)多(duo)态最常见的方(fang)式(shi)。接口(Interface):接口定(ding)义了(le)一(yi)组方法(fa)签名,但不(bu)提供实现(xian)。不同(tong)的类(lei)可以(yi)实现(xian)同一个接(jie)口,并各自(zi)提供方(fang)法(fa)的具体实(shi)现。
通过(guo)接(jie)口引(yin)用指(zhi)向实(shi)现该(gai)接口(kou)的对(dui)象(xiang),也能实(shi)现多(duo)态。抽(chou)象类(lei)(AbstractClass):抽象(xiang)类(lei)可(ke)以包(bao)含抽(chou)象方法(fa)(没(mei)有实(shi)现)和具体方法(fa)。子类(lei)继(ji)承抽象(xiang)类后,必须实现(xian)其(qi)所有(you)抽(chou)象(xiang)方(fang)法。
里氏(shi)替(ti)换(huan)原(yuan)则和多(duo)态,二(er)者(zhe)相(xiang)辅(fu)相成,缺一(yi)不(bu)可(ke)。里(li)氏(shi)替换(huan)原则(ze)为(wei)多(duo)态的实现提供(gong)了前(qian)提条件:只有当(dang)子类(lei)能够(gou)无缝(feng)地替(ti)换父(fu)类时(shi),我们才能(neng)放心(xin)地通过父(fu)类引(yin)用来调(diao)用(yong)子类的方法,而(er)不会(hui)出现(xian)意外。可以(yi)说(shuo),里氏替(ti)换原(yuan)则是“静态(tai)”的规则,它(ta)指导(dao)我们(men)如何设计正确(que)的继承关(guan)系(xi);而多态(tai)则是“动态(tai)”的体现,它(ta)让这种正(zheng)确的继承关系在运行时焕发(fa)活力。
当我(wo)们将里(li)氏(shi)替换原则和多态结(jie)合起来(lai)应用时,我们的(de)代码就(jiu)能实现真正(zheng)的(de)“形神(shen)合一”。对象(xiang)的“形(xing)”(具体(ti)类型)虽然(ran)可(ke)以(yi)变化(hua),但其“神(shen)”(行为和(he)约定(ding))却始(shi)终遵(zun)循(xun)着(zhe)父(fu)类(lei)的(de)规(gui)范。这使(shi)得(de)我们的程序不(bu)仅易于理解(jie),而且具(ju)有(you)强大的生命(ming)力,能(neng)够轻(qing)松应对(dui)未来的各种(zhong)挑战(zhan)。
所(suo)以,下次(ci)当你考虑(lv)继承(cheng)时,不妨多问一句:我(wo)的(de)子(zi)类真(zhen)的能够“忠(zhong)诚”地(di)扮演父类的角(jiao)色吗(ma)?也要(yao)积极(ji)拥(yong)抱多(duo)态(tai),让你(ni)的代码(ma)像(xiang)一位(wei)技艺精湛的演员,能(neng)够根(gen)据角(jiao)色需(xu)求,灵(ling)活地(di)演绎(yi)出(chu)最精(jing)彩(cai)的“多种形态(tai)”!
2025-11-02,18岁XXXX中国人,卓创资讯:美豆需求端迎来利多 国内豆粕需求不佳
1.注射器打水处罚视频教程大全,自身商业行为与诉讼主张矛盾?马斯克曾邀Meta联手收购OpenAIADH101登录账号密码,港股19日跌0.21% 收报25122.9点
图片来源:每经记者 陈濛
摄
2.森泽佳奈2024作品番号封面+亚洲深夜,平均减重12.4%!礼来口服减重药数据公布,未达市场预期,股价暴跌14%、创多年最大单日跌幅
3.宅女的天堂+无码痉挛,“把脉”A股42家上市银行中期资产质量:对公贷款不良率持续向好,零售贷款仍处风险暴露期
黄色软件下载器2+cg1vt冲哥折耳鱼,7月挖掘机销量同比大增25.2%,内外需共振下景气度有望延续
中联社,美国may18XxXXXL56edu到底代表什么是否与络教育和安全有的
封面图片来源:图片来源:每经记者 名称 摄
如需转载请与《每日经济新闻》报社联系。
未经《每日经济新闻》报社授权,严禁转载或镜像,违者必究。
读者热线:4008890008
特别提醒:如果我们使用了您的图片,请作者与本站联系索取稿酬。如您不希望作品出现在本站,可联系金年会要求撤下您的作品。
欢迎关注每日经济新闻APP