里氏替換原則:所有引用基類的地方,必須能透明的使用其子類的對象。
通俗的理解:子類可以擴展父類的功能,但不能改變父類原有的功能。
代碼示例:
1 //電腦 2 public abstract class Computer 3 { 4 public abstract void Use(); 5 } 6 7 /// <summary> 8 /// 筆記本電腦 9 /// </summary> 10 class LaptopCommputer : Computer 11 { 12 public override void Use() 13 { 14 Console.WriteLine("當前正在使用筆記本電腦"); 15 } 16 } 17 18 /// <summary> 19 /// 臺式電腦 20 /// </summary> 21 class DesktopComputer : Computer 22 { 23 public override void Use() 24 { 25 Console.WriteLine("當前正在使用臺式電腦"); 26 } 27 } 28 class Program 29 { 30 static void Main(string[] args) 31 { 32 //筆記本電腦 33 Computer laptop = new LaptopCommputer(); 34 laptop.Use(); 35 //臺式電腦 36 Computer desktopComputer = new DesktopComputer(); 37 desktopComputer.Use(); 38 39 Console.ReadLine(); 40 } 41 }
里氏替換原則表明,在軟件中將一個基類對象替換成它的子類對象,程序將不會產生任何錯誤和異常,反過來則不成立,如果一個軟件實體使用的是一個子類對象的話,那麼它不一定能過使用基類對象。
例如:我喜歡動物,那我一定喜歡狗,以爲狗是動物的子類,但是我喜歡狗,不能推斷我喜歡任何動物,包括貓,老鼠,雖然它們也是動物。
里氏替換原則是實現開閉原則的重要方式之一,由於使用基類對象的地方都可以使用子類對象,因此在程序中儘量使用基類類型來對對象進行定義,而在運行時再確定其子類類型,用子類對象來替換父類對象。
在運行里氏替換原則時,應該將父類設計爲抽象類或者接口,讓子類繼承父類或實現父類,並實現在父類中聲明的方法,運行時,子類實例替換父類實例,可以很方便地擴展系統的功能,無須修改原有子類的代碼,增加新的功能可以通過增加一個新的子類來實現。