本文

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.時速());
}

多型注意事項:

  • 多型的原理是當方法被調用時,無論物件是否被轉換為其父類別,都只有位於物件繼承鍊的最末端的方法實現會被調用。
  • 換句話說,虛擬方法是按照其執行時的類型,而非編譯時類型進行動態細節調用。

參考連結

大話設計模式

封裝

繼承

多型