抽象(abstract)的核心概念是「只規定應該有什麼,但不規定怎麼做」,通常用來建立「共同規範」,讓繼承的子類別自己實作細節。有點類似合約的概念,合約要求所有簽屬合約的人,必須實作合約裡所規範的內容。
【C#學習筆記】10《類別(Class)番外篇》get / set / init
抽象類別是「不能直接new的類別」,因為「Hero」只是概念,不是具體東西。
public abstract class Hero
{
public abstract void Attack();
}
Hero hero = new Hero(); // ❌編譯錯誤:無法建立建構式
抽象函式是「只有宣告,沒有內容的方法」
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)用來保護已經設計完成的類別,不希望被別人修改、繼承或擴充,所以把它封住。
和abstract不同,abstract必須被繼承,而sealed不能被繼承。
public sealed class GameManager
常見用途
防止錯誤繼承
保護邏輯
API設計sealed同樣也能用在方法,代表這個override到此為止,子類別不能再override
public sealed override void Attack()
{
}
abstract(抽象)就像是開放的架構,強制子類別必須延續它的精神去實作細節;而sealed(密封)則是關閉的終點,劃清界線保護既有的成果不被改寫。在物件導向設計中,靈活運用這兩個關鍵字,就能兼顧程式碼的「擴充性」與「安全性」。