本文
1、封裝(Encapsulation)
- 大話設計模式:每個物件都包含它進行操作所需要的所有資訊,這個特性稱為封裝,因此物件不必依賴其他物件來完成自己的操作。 封裝的優點
- 一、良好的封裝能夠減少耦合。
- 二、類別內部的實現可以自由地修改,並不會影響使用者。
- 三、類別具有清晰的對外界面。
這麼說封裝好像有點抽象,拿現實生活中的舉例就是:
當我們按下鍵盤A的時候,螢幕上會顯示A,但我們不必知道電腦背後是怎麼運作,就可以使用它。
程式的舉例: 個人寫程式到目前以來最常使用的C#判斷式,用來檢查字串是否為空。
var test= "This is string"; //一個測試用字串
string.IsNullOrEmpty(test); //檢查字串是否為Null或是空
//我們不必知道IsNullOrEmpty這個方法是如何實作的,
//但我們知道它會幫我們判斷字串是否為Null或是空,並回傳true or false。
2、繼承(Inheritance)
以下取自大話設計模式:
- 物件的繼承代表了一種 “is-a” 的關係,如果兩個物件 A 和 B,可以描述為『B是A』,則表明了B可以繼承A。Ex:特斯拉是車子、貓是哺乳類動物。
- 繼承者可以理解為對被繼承者的特殊化,因為他除了具備繼承者的特性外,還具備自己獨有的個性。Ex:特斯拉消耗能源是靠電能相較於傳統汽車使用汽油、貓擁有爬高爬樹等能力將較於傳統哺乳類動物沒有的技能。
- 繼承定義了類別如何相互關聯共用特性。
- 子類別不但繼承父類別所有特性,還可以定義新的特性。
如果子類別繼承於父類別:
- 一、子類別擁有父類別非 private 的屬性和功能。
- 二、子類別具有自己的屬性和功能 => 子類別可以擴展父類別的所有特性。
- 三、子類別還可以用自己的方式實現父類別 => 方法重寫。
//產生一個汽車的類別,有一個方向盤、四個輪子。
public class 汽車
{
protected int 輪子 = 4;
protected int 方向盤 = 1;
}
//產生一個特斯拉類別繼承汽車
public class 特斯拉 : 汽車
{
public string 特斯拉輪子()
{
return "特斯拉有" + 輪子 + "個輪子";
}
public string 特斯拉方向盤()
{
return "特斯拉有" + 方向盤 + "個方向盤";
}
}
private static void Main(string[] args)
{
特斯拉 Tesla = new 特斯拉();
Console.WriteLine(Tesla.特斯拉輪子());
Console.WriteLine(Tesla.特斯拉方向盤());
}
繼承的優點:
- 繼承可以將子類別共用的部分都放在父類別,這可以讓程式得到了共用,避免重複。
- 可以使得修改或擴展繼承而來的實現都較為容易。
繼承的缺點:
- 父類別一旦有變動,子類別就必須跟著改變。
- 繼承會破壞封裝、父類別實現的細節暴露給子類別。
- 繼承是一種類別與類別『強耦合』的關係。
所以繼承請『不要用』或『謹慎使用』。
3、多型(polymorphism)
- 大話設計模式:多型表示不同的物件可以執行相同的動作,但要透過他們自己的實現程式碼來執行。
注意事項:
- 一、子類別以父類別的身分出現。
- 二、子類別在工作時以自己的方式來實現。
- 三、子類別以父類別的身分出現時,子類別特有的屬性和方法不能使用。
使用方法:
- 為了使子類別的實體完全接替來自父類別的類別成員,父雷別必須將該成員宣告為虛擬(virtual)。
- 子類別可以透過 override 將父類別的實現替換為他自己的實現,這就是方法重寫 Override。
//產生一個汽車的類別,有基本啟動方式、跟時速。
public class 汽車
{
public virtual string 啟動方式()
{
return "汽油";
}
public virtual string 時速()
{
return "100";
}
}
//產生一個特斯拉類別繼承汽車並且重寫啟動方式跟時速方法。
public class 特斯拉 : 汽車
{
public override string 啟動方式()
{
return "電能";
}
public override string 時速()
{
return "300";
}
}
private static void Main(string[] args)
{
汽車 car = new 汽車();
Console.WriteLine("汽車啟動方式:" + car.啟動方式());
Console.WriteLine("汽車時速:" + car.時速());
特斯拉 Tesla = new 特斯拉();
Console.WriteLine("特斯拉啟動方式:" + Tesla.啟動方式());
Console.WriteLine("特斯拉時速:" + Tesla.時速());
}
多型注意事項:
- 多型的原理是當方法被調用時,無論物件是否被轉換為其父類別,都只有位於物件繼承鍊的最末端的方法實現會被調用。
- 換句話說,虛擬方法是按照其執行時的類型,而非編譯時類型進行動態細節調用。
參考連結
封裝
- 1、91之ASP.NET由淺入深 不負責講座 Day14 – Object Oriented (1)
- 2、思考物件導向(1)物件導向與封裝
- 3、 c# 物件導向程式 - 2.封裝、繼承、多型的三大特性
- 4、[ASP.NET] [C#] 物件導向 - 封裝
繼承
多型