設計模式六大原則:里氏替換原則

目錄: html

  設計模式六大原則:單一職責原則設計模式

  設計模式六大原則:接口隔離原則 ide

  設計模式六大原則:依賴倒置原則spa

  設計模式六大原則:里氏替換原則設計

  設計模式六大原則:迪米特法則code

  設計模式六大原則:開閉原則htm

里氏替換原則:對象

  子類應當能夠替換父類並出如今父類可以出現的地方。好比:公司搞年度派對,都有員工均可以抽獎,那麼無論是新員工仍是老員工,也無論是總部員工仍是外派員工,都應當能夠參加抽獎。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 }
view code

  由上述代碼能夠看出,若類B在繼承類A時不注意,重寫了父類方法func1就會致使結果與預想的不一致,改變了父類原有的功能。故里氏轉換原則應知足如下要求:

  一、子類能夠實現父類的抽象方法,但不能覆蓋父類的非抽象方法

  二、子類能夠增長本身特有的方法

  三、當子類的方法重載父類的方法時,方法的形參要比父類方法的輸入參數更寬鬆

  四、當子類的方法實現父類的抽象方法時,方法的返回值應比父類更嚴格

優勢:

  能夠大大減小程序的bug以及加強代碼的可讀性

相關文章
相關標籤/搜索