前言
此篇觀念也會延續之前幾篇,可以一同搭配觀看。
- 1、Object Oriented物件導向-3:封裝(Encapsulation)、繼承(Inheritance)與多型(polymorphism)
- 2、Object Oriented物件導向-4:抽象類別(Abstract)與介面(Interface)
本文
里氏替換原則 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($"電動車有:{電動車.後照鏡()}");
}