里氏代換原則(Liskov Substitution Principle)
阿新 • • 發佈:2019-02-04
作用
它指導我們如何正確地進行繼承與派生,併合理地重用程式碼!
定義
子型別必須能夠替換掉它們的父型別、並出現在父類能夠出現的任何地方。
這個就是儘量用多型的方法程式設計,也就是GRASP模式中的多型。
如果對於每一個型別為T1的物件o1,都有型別為T2的物件o2,使得以T1定義的所有程式P在所有的物件o1都代換成o2時,程式P的行為沒有變化,那麼型別T2是型別T1的子型別。
換言之,一個軟體實體如果使用的是一個基類的話,那麼一定適用於其子類,而且它根本不能察覺出基類物件和子類物件的區別。
反過來代換不成立。
里氏替換原則要點:
1) 對於LSP的違反也潛在的違反了OCP
2) 正方形從長方形繼承的例子微妙的違反了這種原則
3) 在考慮一個特定的設計是否恰當時,不能孤立地來看這個解決方案,必須根據設計的使用者所做出的合理假設來審視它
4) 物件的行為方式是軟體真正所關注的問題,IS A 關係是就行為而言的
5) 派生類只能使用相等或更弱的前置條件來替換原始的前置條件,只能使用相等或更強的前置條件來替換原始的後置條件。
6) 完成的功能少於基類的派生類通常不能替換基類,也不符合LSP
7) 派生類不應該丟擲基類不能預計的異常,否則違反LSP
里氏代換原則分析
里氏代換原則可以通俗表述為:在軟體中如果能夠使用基類物件,那麼一定能夠使用其子類物件。把基類都替換成它的子類,程式將不會產生任何錯誤和異常,反過來則不成立,如果一個軟體實體使用的是一個子類的話,那麼它不一定能夠使用基類。