程式設計原則之里氏替代原則
阿新 • • 發佈:2018-12-10
一、什麼是里氏替代原則
定義:
T1類的物件O1,T2類的物件O2,如果在程式P中將T1的物件O1全部替換成T2的物件O2,程式P的行為不發生變化,則我們說T2是T1的子類。
定義引申:
1、子類可以擴充套件父類的方法,但最好不要重寫覆蓋父類已有的非抽象方法。
2、子類重寫/過載父類的方法時入參型別的範圍不應該縮小,也就是說應該是原入參型別或者是其父類。
3、子類重寫/過載父類的方法時出參型別的範圍不應該擴大,也就是說應該是原出參型別或者是其子類。
二、分析一個具體的業務場景
場景:
一般我們認為正方形是一種特殊的長方形,可以將正方形申明為長方形的父類。在這麼一種情況,當長方形的寬比長小或者等時,我們將長方形的寬進行resize,每次加1。此時我們看一下將正方形申明為長方形的子類是否違反里氏替換原則。
對於長方形的例項在上述的測試示例中是正常的,但是正方形的例項測試呼叫resize方法時會陷入死迴圈,所以這裡Square類的例項替換Rectangle的例項後程序的行為發生了變化,不符合里氏替換原則,故在此種業務場景中不能將正方形看成是長方形的子類。
下面是用一個公共的介面來進行改進,讓其均實現該介面:
此時的實現由於Square類與Rectangle類不再存在繼承關係,對於Square類的例項在instanceof Rectangle的判斷中是不成立的,故不會對其進行resize的行為。這種做法才符合里氏替代原則。