1.里氏替換原則的定義
里氏替換原是繼承復用的基礎,它反映了基類與子類之間的關系,是對開閉原則的補充,是對實作抽象化的具體步驟的規范,
所有參考基類(父類)的地方必須能透明地使用其子類的物件,
2.里氏替換原則的作用
里氏替換原則的主要作用如下,
- 里氏替換原則是實作開閉原則的重要方式之一,
- 它克服了繼承中重寫父類造成的可復用性變差的缺點,
- 它是動作正確性的保證,即類的擴展不會給已有的系統引入新的錯誤,降低了代碼出錯的可能性,
- 加強程式的健壯性,同時變更時可以做到非常好的兼容性,提高程式的維護性、可擴展性,降低需求變更時引入的風險,
3.里氏替換原則的實作方法
里氏替換原則通俗來講就是:子類可以擴展父類的功能,但不能改變父類原有的功能,也就是說:子類繼承父類時,除添加新的方法完成新增功能外,盡量不要重寫父類的方法,
根據上述理解,對里氏替換原則的定義可以總結如下:
- 子類可以實作父類的抽象方法,但不能覆寫父類的非抽象方法
- 子類中可以增加自己特有的方法
- 當子類的方法多載父類的方法時,方法的前置條件(即方法的輸入引數)要比父類的方法更寬松
- 當子類的方法實作父類的方法時(重寫/多載或實作抽象方法),方法的后置條件(即方法的的輸出/回傳值)要比父類的方法更嚴格或相等
通過重寫父類的方法來完成新的功能寫起來雖然簡單,但是整個繼承體系的可復用性會比較差,特別是運用多型比較頻繁時,程式運行出錯的概率會非常大,
如果程式違背了里氏替換原則,則繼承類的物件在基類出現的地方會出現運行錯誤,這時其修正方法是:取消原來的繼承關系,重新設計它們之間的關系,
【例1】里氏替換原則在“幾維鳥不是鳥”實體中的應用,
分析:鳥一般都會飛行,如燕子的飛行速度大概是每小時 120 千米,但是新西蘭的幾維鳥由于翅膀退化無法飛行,假如要設計一個實體,計算這兩種鳥飛行 300 千米要花費的時間,顯然,拿燕子來測驗這段代碼,結果正確,能計算出所需要的時間;但拿幾維鳥來測驗,結果會發生“除零例外”或是“無窮大”,明顯不符合預期,其類圖如圖 1 所示,

package principle;
public class LSPtest {
public static void main(String[] args) {
Bird bird1 = new Swallow();
Bird bird2 = new BrownKiwi();
bird1.setSpeed(120);
bird2.setSpeed(120);
System.out.println("如果飛行300公里:");
try {
System.out.println("燕子將飛行" + bird1.getFlyTime(300) + "小時.");
System.out.println("幾維鳥將飛行" + bird2.getFlyTime(300) + "小時,");
} catch (Exception err) {
System.out.println("發生錯誤了!");
}
}
}
//鳥類
class Bird {
double flySpeed;
public void setSpeed(double speed) {
flySpeed = speed;
}
public double getFlyTime(double distance) {
return (distance / flySpeed);
}
}
//燕子類
class Swallow extends Bird {
}
//幾維鳥類
class BrownKiwi extends Bird {
public void setSpeed(double speed) {
flySpeed = 0;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/418998.html
標籤:Java
