目錄: html
設計模式六大原則:單一職責原則設計模式
設計模式六大原則:接口隔離原則 ide
設計模式六大原則:迪米特法則code
里氏替換原則:對象
子類應當能夠替換父類並出如今父類可以出現的地方。好比:公司搞年度派對,都有員工均可以抽獎,那麼無論是新員工仍是老員工,也無論是總部員工仍是外派員工,都應當能夠參加抽獎。blog
里氏替換至少包含一下兩個含義:繼承
一、里氏替換原則是針對繼承而言的,若是繼承是爲了實現代碼重用,也就是爲了共享方法,那麼共享的父類方法就應該保持不變,不能被子類從新定義。子類只能經過新添加方法來擴展功能,父類和子類均可以實例化,而子類繼承的方法和父類是同樣的,父類調用方法的地方,子類也能夠調用同一個繼承得來的,邏輯和父類一致的方法,這時用子類對象將父類對象替換掉時,固然邏輯一致,相安無事。
二、若是繼承的目的是爲了多態,而多態的前提就是子類覆蓋並從新定義父類的方法,爲了符合LSP,咱們應該將父類定義爲抽象類,並定義抽象方法,讓子類從新定義這些方法,當父類是抽象類時,父類就是不能實例化,因此也不存在可實例化的父類對象在程序裏。也就不存在子類替換父類實例(根本不存在父類實例了)時邏輯不一致的可能。
案例:
1 internal class Program 2 { 3 private static void Main(string[] args) 4 { 5 A a = new A(); 6 Console.WriteLine($"100-50={(a.func1(100, 50))}"); 7 8 B b = new B(); 9 Console.WriteLine($"100-50={(b.func1(100, 50))}"); 10 Console.WriteLine($"100-50={(b.func2(100, 50))}"); 11 12 Console.ReadKey(); 13 } 14 } 15 16 internal class A 17 { 18 public int func1(int num1, int num2) 19 { 20 return num1 - num2; 21 } 22 } 23 24 internal class B : A 25 { 26 //public int func1(int num1, int num2) 27 //{ 28 // return num1 + num2; 29 //} 30 31 public int func2(int num1, int num2) 32 { 33 return func1(num1, num2) + 100; 34 } 35 }
由上述代碼能夠看出,若類B在繼承類A時不注意,重寫了父類方法func1就會致使結果與預想的不一致,改變了父類原有的功能。故里氏轉換原則應知足如下要求:
一、子類能夠實現父類的抽象方法,但不能覆蓋父類的非抽象方法
二、子類能夠增長本身特有的方法
三、當子類的方法重載父類的方法時,方法的形參要比父類方法的輸入參數更寬鬆
四、當子類的方法實現父類的抽象方法時,方法的返回值應比父類更嚴格
優勢:
能夠大大減小程序的bug以及加強代碼的可讀性