前言

此篇觀念也會延續之前幾篇,可以一同搭配觀看。

本文

里氏替換原則 Liskov Substitution Principle(LSP)

精神:

使用父類的地方,必須可以使用子類別代替,而不需要任何改變。

基本原則:

  • 1、子類別必須完全實現父類別的方法,如果子類不擁有父類的全部屬性或者行為,不能強行繼承,要斷掉繼承。
  • 2、子類別可以擁有自己不同的屬性與方法。

來段範例:今天我們有個傳統車廠發現電動車似乎才是未來,也想透過自己以前的經驗來設計電動車,老闆說不就都是車嘛?

 	public class 車子
        {
            public int 車輪 = 4;
            public int 方向盤 = 1;
            public string 引擎()
            {
                return "汽油引擎";
            }

            public string 後照鏡()
            {
                return "左右後視鏡+駕駛座後視鏡";
            }
        }
		
	//直接繼承車子
        public class 電動車 : 車子
        { 
            
        }
		
	private static void Main(string[] args)
        {
            var 汽車 = new 車子();
            Console.WriteLine($"汽車有:{汽車.車輪}個車輪");
            Console.WriteLine($"汽車有:{汽車.方向盤}個方向盤");
            Console.WriteLine($"汽車有:{汽車.引擎()}");
            Console.WriteLine($"汽車有:{汽車.後照鏡()}");

            Console.WriteLine("============================");

            var 電動車 = new 電動車();
            Console.WriteLine($"電動車有:{電動車.車輪}個車輪");
            Console.WriteLine($"電動車有:{電動車.方向盤}個方向盤");
            Console.WriteLine($"電動車有:{電動車.引擎()}");
            Console.WriteLine($"電動車有:{電動車.後照鏡()}");
        }

這時候認真一看馬上就發現 代誌不是憨人想的這麼簡單 ,首先思考一下電動車應該與汽車不同本質的東西有哪些?能夠延用的舊有經驗有哪些?

  • 1、不同:引擎運作方式、後照鏡有電腦感應。
  • 2、延用:方向盤、車輪。

改寫程式如下:

	//將車子做成一個設計初稿
	public abstract class 車子
        {
            public int 車輪 = 4;
            public int 方向盤 = 1;
            abstract public string 引擎();
            abstract public string 後照鏡(); 
        }
		
	//汽車繼承車子實作時再決定自己需要哪些東西
        public class 汽車 : 車子
        {
            public override string 引擎()
            {
                return "汽油引擎";
            }

            public override string 後照鏡()
            {
                return "左右後視鏡+駕駛座後視鏡";
            }
        }
		
	//同理電動車也是
        public class 電動車 : 車子
        {
            public override string 引擎()
            {
                return "電動引擎";
            }

            public override string 後照鏡()
            {
                return "左右後視鏡+駕駛座後視鏡+360度電腦感應";
            }
        }
		
	private static void Main(string[] args)
        {
            var 汽車 = new 汽車();
            Console.WriteLine($"汽車有:{汽車.車輪}個車輪");
            Console.WriteLine($"汽車有:{汽車.方向盤}個方向盤");
            Console.WriteLine($"汽車有:{汽車.引擎()}");
            Console.WriteLine($"汽車有:{汽車.後照鏡()}");

            Console.WriteLine("============================");

            var 電動車 = new 電動車();
            Console.WriteLine($"電動車有:{電動車.車輪}個車輪");
            Console.WriteLine($"電動車有:{電動車.方向盤}個方向盤");
            Console.WriteLine($"電動車有:{電動車.引擎()}");
            Console.WriteLine($"電動車有:{電動車.後照鏡()}");
        }

參考連結