iT邦幫忙

0

【C#學習筆記】11《類別(Class)》抽象類別與抽象函式(abstract)、密封類別(sealed)

  • 分享至 

  • xImage
  •  

抽象(abstract)的核心概念是「只規定應該有什麼,但不規定怎麼做」,通常用來建立「共同規範」,讓繼承的子類別自己實作細節。有點類似合約的概念,合約要求所有簽屬合約的人,必須實作合約裡所規範的內容。


【C#學習筆記】10《類別(Class)番外篇》get / set / init


一.抽象類別(Abstract Class)

抽象類別是「不能直接new的類別」,因為「Hero」只是概念,不是具體東西。

public abstract class Hero
{
    public abstract void Attack();
}
Hero hero = new Hero(); // ❌編譯錯誤:無法建立建構式

二.抽象函式(Abstract Method)

抽象函式是「只有宣告,沒有內容的方法」

public abstract void Attack();

這代表:
所有角色都應該有Attack,但攻擊方式不一定相同。
例如劍士可能揮劍,法師可能丟火球,所以子類別必須實作。

public override void Attack()
{
    Console.WriteLine("Warrior attacks!");
}

三、為什麼需要抽象?

因為很多時候「某些東西有共同概念,但實作不同」。通常希望能統一規範、強制子類別實作用同一種方式操作。

類別 都有什麼
Warrior Attack
Mage Attack
Archer Attack

如果沒有abstract,子類別可能忘記改或出現空方法,讓整個設計不完整。
所以abstract的真正目的是建立規範強制實作或使用多型(Polymorphism)

所有Hero都必須能Attack
如果沒override會編譯錯誤
每個角色會自動使用自己的攻擊方式。
// 建立一個英雄清單,裡面包含各種不同的職業
List<Hero> heroes = new List<Hero> { new Warrior(), new Mage() };

foreach (Hero hero in heroes)
{
    hero.Attack(); // 自動依據實際的子類別執行對應的攻擊動作
}
多型(Polymorphism)會在後續章節提及

四、密封類別(sealed Class)

密封類別(sealed)用來保護已經設計完成的類別,不希望被別人修改、繼承或擴充,所以把它封住。
abstract不同,abstract必須被繼承,而sealed不能被繼承。

public sealed class GameManager

常見用途

防止錯誤繼承
保護邏輯
API設計
sealed同樣也能用在方法,代表這個override到此為止,子類別不能再override

public sealed override void Attack()
{
}

abstract(抽象)就像是開放的架構,強制子類別必須延續它的精神去實作細節;而sealed(密封)則是關閉的終點,劃清界線保護既有的成果不被改寫。在物件導向設計中,靈活運用這兩個關鍵字,就能兼顧程式碼的「擴充性」與「安全性」。


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言