設計模式七大原則之裡式替換原則
阿新 • • 發佈:2020-07-13
1、裡式替換原則在1988年,由麻省理工學院的一位姓裡的女士提出的。
2、所有引用基類的地方必須能透明地使用子類的物件
3、在使用繼承時,遵循裡式替換原則,在子類中儘量不要重寫父類的方法
4、裡式替換原則告訴我們,繼承實際上讓兩個類耦合性增強了,在適當的情況下,可以通過聚合、組合、依賴來解決問題。
5、通用的做法是:原來的父類和子類都繼承一個更通俗的基類,原有的繼承關係去掉,採用依賴,聚合,組合燈關係代替。
案例:
public class Liskov { public static void main(String[] args) { A a = new A(); System.out.println("11-3=" + a.func1(11, 3)); System.out.println("1-8=" + a.func1(1, 8)); System.out.println("---------------------------"); B b = new B(); System.out.println("11-3="+b.func1(11,3)); System.out.println("1-8="+b.func1(1,8)); System.out.println("11+3+9="+b.func2(11,3)); } }class A { public int func1(int num1, int num2) { return num1 - num2; } } class B extends A { public int func1(int a, int b) { return a + b; } public int func2(int a, int b) { return super.func1(a, b) + 9; } }
使用裡式替換原則改進:
public class Liskov { publicstatic void main(String[] args) { A a = new A(); System.out.println("11-3=" + a.func1(11, 3)); System.out.println("1-8=" + a.func1(1, 8)); System.out.println("---------------------------"); B b = new B(); System.out.println("11-3=" + b.func3(11, 3)); System.out.println("1-8=" + b.func3(1, 8)); System.out.println("11+3+9=" + b.func2(11, 3)); } } class Basic { } class A extends Basic { public int func1(int num1, int num2) { return num1 - num2; } } class B extends Basic { //b使用a的方法 private A a = new A(); public int func1(int a, int b) { return a + b; } public int func2(int a, int b) { return func1(a, b) + 9; } //使用組合降低耦合性 public int func3(int a, int b) { return this.a.func1(a, b); } }
繼承必須確保超類所擁有的的性質在子類中仍然成立
--------
裡式替換原則主要闡述了有關繼承的一些原則,也就是什麼時候應該使用繼承,什麼時候不應該使用繼承,以及其中蘊含的原理。
裡式替換原則是繼承複用的基礎,它反映了基類與子類之間的關係,是對開閉原則的補充,是對實現抽象化的具體步驟的規範。
--------
裡式替換原則的作用:
裡式替換原則是實現開閉原則的重要方式之一
它克服了繼承中重寫父類造成的可複用性變差的缺點
他是動作正確性的保證。即類的擴充套件不會給已有的系統引入新的錯誤,降低了程式碼出錯的可能性。
裡式替換原則的實現方法:
裡式替換原則通俗來講就是:子類可以擴充套件父類的功能,但不能改變父類原有的功能。
也就是說:子類繼承父類時,除了新增新的方法完成新增功能外,儘量不要重寫父類的方法。
裡式替換原則主要闡述了有關繼承的一些原則,也就是什麼時候應該使用繼承,什麼時候不應該使用繼承,以及其中蘊含的原理。
裡式替換原則是繼承複用的基礎,它反映了基類與子類之間的關係,是對開閉原則的補充,是對實現抽象化的具體步驟的規範。