1. 程式人生 > >里氏代換原則(Liskov Substitution Principle)

里氏代換原則(Liskov Substitution Principle)

作用

它指導我們如何正確地進行繼承與派生,併合理地重用程式碼!

定義

子型別必須能夠替換掉它們的父型別、並出現在父類能夠出現的任何地方。

這個就是儘量用多型的方法程式設計,也就是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

里氏代換原則分析

里氏代換原則可以通俗表述為:在軟體中如果能夠使用基類物件,那麼一定能夠使用其子類物件。把基類都替換成它的子類,程式將不會產生任何錯誤和異常,反過來則不成立,如果一個軟體實體使用的是一個子類的話,那麼它不一定能夠使用基類。

里氏代換原則是實現開閉原則的重要方式之一,由於使用基類物件的地方都可以使用子類物件,因此在程式中儘量使用基類型別來對物件進行定義,而在執行時再確定其子類型別,用子類物件來替換父類物件。