[設(shè)計(jì)原則]里氏替換原則

在面向?qū)ο蟮恼Z(yǔ)言中,繼承是必不可少的、非常優(yōu)秀的語(yǔ)言機(jī)制,它有如下優(yōu)點(diǎn):

  • 代碼共享,減少創(chuàng)建類(lèi)的工作量,每個(gè)子類(lèi)都擁有父類(lèi)的方法和屬性。
  • 提高代碼的重用性。
  • 子類(lèi)可以形似父類(lèi),但又異于父類(lèi)。
  • 提高代碼的可擴(kuò)展性。
  • 提高產(chǎn)品或項(xiàng)目的開(kāi)放性。

繼承的缺點(diǎn)如下:

  • 繼承是侵入性的,只要繼承,就必須擁有父類(lèi)的所有屬性和方法。
  • 降低代碼的靈活性。
  • 增強(qiáng)了耦合性。當(dāng)父類(lèi)的常量、變量和方法被修改時(shí),需要考慮子類(lèi)的修改,而且在缺乏規(guī)范的環(huán)境下,這種修改可能需要代碼重構(gòu)。

如何讓繼承的利大于弊,解決的方案是引入里氏替換原則。

里氏替換原則(LSP)的定義:

  • 嚴(yán)格的定義:如果對(duì)每一個(gè)類(lèi)型為T(mén)1的對(duì)象o1,都有類(lèi)型為T(mén)2的對(duì)象o2,使得以T1定義的所有程序P在所有的對(duì)象o1都換成o2時(shí),程序P的行為沒(méi)有變化,那么類(lèi)型T2是類(lèi)型T1的子類(lèi)型。
  • 通俗的定義:所有引用基類(lèi)的地方必須能透明地使用其子類(lèi)的對(duì)象。
  • 更通俗的定義:子類(lèi)可以擴(kuò)展父類(lèi)的功能,但不能改變父類(lèi)原有的功能。

里氏替換原則包含以下4層含義:

  • 子類(lèi)可以實(shí)現(xiàn)父類(lèi)的抽象方法,但是不能覆蓋父類(lèi)的非抽象方法。
  • 子類(lèi)中可以增加自己特有的方法。
  • 當(dāng)子類(lèi)覆蓋或?qū)崿F(xiàn)父類(lèi)的方法時(shí),方法的前置條件(即方法的形參)要比父類(lèi)方法的輸入?yún)?shù)更寬松。
  • 當(dāng)子類(lèi)的方法實(shí)現(xiàn)父類(lèi)的抽象方法時(shí),方法的后置條件(即方法的返回值)要比父類(lèi)更嚴(yán)格。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,779評(píng)論 18 399
  • 1.import static是Java 5增加的功能,就是將Import類(lèi)中的靜態(tài)方法,可以作為本類(lèi)的靜態(tài)方法來(lái)...
    XLsn0w閱讀 1,267評(píng)論 0 2
  • 目錄: 設(shè)計(jì)模式六大原則(1):?jiǎn)我宦氊?zé)原則 設(shè)計(jì)模式六大原則(2):里氏替換原則 設(shè)計(jì)模式六大原則(3):依賴(lài)倒...
    加油小杜閱讀 742評(píng)論 0 1
  • 命名空間 swift中引入了命名空間的概念,只要在同一個(gè)命名空間下所有的資源都是共享的,而且默認(rèn)情況下項(xiàng)目名稱(chēng)就是...
    天蠶閱讀 252評(píng)論 0 0
  • ?楔子Runtime是什么?見(jiàn)名知意,其概念無(wú)非就是“因?yàn)?Objective-C 是一門(mén)動(dòng)態(tài)語(yǔ)言,所以它需要一個(gè)...
    abb266389fd0閱讀 11,433評(píng)論 37 309