05-設計模式6原則大原則之里氏替換原則(轉載)

肯定有不少人跟我剛看到這項原則的時候一樣墓造,對這個原則的名字充滿疑惑祠斧。其實原因就是這項原則最早是在1988年速缆,由麻省理工學院的一位姓里的女士(Barbara Liskov)提出來的规哪。
定義1:如果對每一個類型為 T1的對象 o1烁落,都有類型為 T2 的對象o2鸟蜡,使得以 T1定義的所有程序 P 在所有的對象 o1 都代換成 o2 時膜赃,程序 P 的行為沒有發(fā)生變化,那么類型 T2 是類型 T1 的子類型揉忘。
定義2:所有引用基類的地方必須能透明地使用其子類的對象跳座。
問題由來:有一功能P1,由類A完成∑現(xiàn)需要將功能P1進行擴展疲眷,擴展后的功能為P,其中P由原有功能P1與新功能P2組成乳蓄。新功能P由類A的子類B來完成咪橙,則子類B在完成新功能P2的同時,有可能會導致原有功能P1發(fā)生故障虚倒。
解決方案:當使用繼承時美侦,遵循里氏替換原則。類B繼承類A時魂奥,除添加新的方法完成新增功能P2外菠剩,盡量不要重寫父類A的方法,也盡量不要重載父類A的方法耻煤。
繼承包含這樣一層含義:父類中凡是已經(jīng)實現(xiàn)好的方法(相對于抽象方法而言)具壮,實際上是在設定一系列的規(guī)范和契約准颓,雖然它不強制要求所有的子類必須遵從這些契約,但是如果子類對這些非抽象方法任意修改棺妓,就會對整個繼承體系造成破壞攘已。而里氏替換原則就是表達了這一層含義。
繼承作為面向對象三大特性之一怜跑,在給程序設計帶來巨大便利的同時样勃,也帶來了弊端。比如使用繼承會給程序帶來侵入性性芬,程序的可移植性降低峡眶,增加了對象間的耦合性,如果一個類被其他的類所繼承植锉,則當這個類需要修改時辫樱,必須考慮到所有的子類,并且父類修改后俊庇,所有涉及到子類的功能都有可能會產生故障狮暑。
舉例說明繼承的風險,我們需要完成一個兩數(shù)相減的功能辉饱,由類ObjectSuper來負責心例。



運行結果:

后來,我們需要增加一個新的功能:完成兩數(shù)相加鞋囊,然后再與100求和,由類ObjectSubClass來負責瞎惫。即類B需要完成兩個功能:
兩數(shù)相減溜腐。
兩數(shù)相加,然后再加100瓜喇。

由于類ObjectClass已經(jīng)實現(xiàn)了第一個功能挺益,所以類ObjectSubClass繼承類ObjectSuper后,只需要再完成第二個功能就可以了乘寒,代碼如下:




類B完成后望众,運行結果:

我們發(fā)現(xiàn)原本運行正常的相減功能發(fā)生了錯誤。原因就是類B在給方法起名時無意中重寫了父類的方法伞辛,造成所有運行相減功能的代碼全部調用了類ObjectSubClass重寫后的方法烂翰,造成原本運行正常的功能出現(xiàn)了錯誤。在本例中蚤氏,引用基類ObjectSuper完成的功能甘耿,換成子類ObjectSubClass之后,發(fā)生了異常竿滨。在實際編程中佳恬,我們常常會通過重寫父類的方法來完成新的功能捏境,這樣寫起來雖然簡單,但是整個繼承體系的可復用性會比較差毁葱,特別是運用多態(tài)比較頻繁時垫言,程序運行出錯的幾率非常大。如果非要重寫父類的方法倾剿,比較通用的做法是:原來的父類和子類都繼承一個更通俗的基類筷频,原有的繼承關系去掉,采用依賴柱告、聚合截驮,組合等關系代替。
里氏替換原則通俗的來講就是:子類可以擴展父類的功能际度,但不能改變父類原有的功能葵袭。它包含以下4層含義:
子類可以實現(xiàn)父類的抽象方法,但不能覆蓋父類的非抽象方法乖菱。
子類中可以增加自己特有的方法坡锡。
當子類的方法重載父類的方法時,方法的前置條件(即方法的形參)要比父類方法的輸入?yún)?shù)更寬松窒所。
當子類的方法實現(xiàn)父類的抽象方法時鹉勒,方法的后置條件(即方法的返回值)要比父類更嚴格。
看上去很不可思議吵取,因為我們會發(fā)現(xiàn)在自己編程中常常會違反里氏替換原則禽额,程序照樣跑的好好的。所以大家都會產生這樣的疑問皮官,假如我非要不遵循里氏替換原則會有什么后果脯倒?
后果就是:你寫的代碼出問題的幾率將會大大增加。

轉自:http://blog.csdn.net/zhengzhb/article/details/7281833

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末捺氢,一起剝皮案震驚了整個濱河市藻丢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌摄乒,老刑警劉巖悠反,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異馍佑,居然都是意外死亡斋否,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門拭荤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來如叼,“玉大人,你說我怎么就攤上這事穷劈×。” “怎么了踊沸?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長社证。 經(jīng)常有香客問我逼龟,道長,這世上最難降的妖魔是什么追葡? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任腺律,我火速辦了婚禮,結果婚禮上宜肉,老公的妹妹穿的比我還像新娘匀钧。我一直安慰自己,他們只是感情好谬返,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布之斯。 她就那樣靜靜地躺著,像睡著了一般遣铝。 火紅的嫁衣襯著肌膚如雪佑刷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天酿炸,我揣著相機與錄音瘫絮,去河邊找鬼。 笑死填硕,一個胖子當著我的面吹牛麦萤,可吹牛的內容都是我干的。 我是一名探鬼主播扁眯,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼频鉴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了恋拍?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤藕甩,失蹤者是張志新(化名)和其女友劉穎施敢,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狭莱,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡僵娃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了腋妙。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片默怨。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖骤素,靈堂內的尸體忽然破棺而出匙睹,到底是詐尸還是另有隱情愚屁,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布痕檬,位于F島的核電站霎槐,受9級特大地震影響,放射性物質發(fā)生泄漏梦谜。R本人自食惡果不足惜丘跌,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望唁桩。 院中可真熱鬧闭树,春花似錦、人聲如沸荒澡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽仰猖。三九已至捏肢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間饥侵,已是汗流浹背鸵赫。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留躏升,地道東北人辩棒。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像膨疏,于是被迫代替她去往敵國和親一睁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內容

  • 程序設計的6大原則: 單一職責原則里氏替換原則依賴倒置原則接口隔離原則迪米特法則開閉原則 從根本學好佃却,理解為什么要...
    silencefun閱讀 2,403評論 1 4
  • 設計模式六大原則 設計模式六大原則(1):單一職責原則 定義:不要存在多于一個導致類變更的原因者吁。通俗的說,即一個類...
    viva158閱讀 765評論 0 1
  • 轉載標注聲明:http://www.uml.org.cn/sjms/201211023.asp 目錄:[設計模式六...
    Bloo_m閱讀 707評論 0 7
  • 設計模式六大原則(1):單一職責原則 定義:不要存在多于一個導致類變更的原因饲帅。通俗的說复凳,即一個類只負責一項職責。 ...
    Jabir_Zhang閱讀 643評論 0 3
  • 晚上給孩子們買了酸奶灶泵,自己也買了些育八,原本計劃當我的晚餐,可是在放學的時候被他們都分了赦邻,好傷心髓棋,呵呵,傷心一點都沒有...
    甜菜的眼淚閱讀 3,499評論 0 1