abstract class:不可實例化,僅供繼承。abstract 修飾,隱含 virtual,不可加 static/virtual。override。abstract class Shape
{
public abstract int Area { get; } // 抽象屬性 (唯讀)
public abstract void Draw(); // 抽象方法
public abstract event EventHandler Changed; // 抽象事件
public abstract int this[int i] { get; } // 抽象索引子
// 具體成員
public void Print() => Console.WriteLine($"Area: {Area}");
}
sealed class Leaf { })。abstract 共用 (邏輯互斥)。class Base { public virtual void M() {} }
class Middle : Base
{
public sealed override void M() {} // 封鎖進一步覆寫
}
class Leaf : Middle
{
// public override void M() {} // 編譯錯誤
}
衍生類可將虛擬成員重新聲明為抽象,強制下一層實作:
class Base { public virtual void M() {} }
abstract class Middle : Base
{
public abstract override void M(); // 抽象覆寫
}
class Leaf : Middle
{
public override void M() {} // 必須實作
}
class Base { public void M() {} }
class Derived : Base
{
public new void M() {} // 隱藏基類 M
}
// 行為差異
Base b = new Derived(); b.M(); // 呼叫 Base.M (非虛擬)
Derived d = new Derived(); d.M(); // 呼叫 Derived.M
new 僅影響靜態綁定 (透過衍生類型別參考)。override 共用。new 明確意圖)。abstract class Animal
{
public abstract void Speak();
public virtual void Move() => Console.WriteLine("Moving");
}
abstract class Mammal : Animal
{
public sealed override void Move() => Console.WriteLine("Mammal moving");
// Speak 仍為抽象
}
class Dog : Mammal
{
public override void Speak() => Console.WriteLine("Woof");
// Move 已密封,不可覆寫
}
class Cat : Mammal
{
public override void Speak() => Console.WriteLine("Meow");
}
| 需求 | 選擇 |
|---|---|
| 定義契約、強制實作、共享部分邏輯 | abstract class |
| 純契約、多重實作、無共享狀態 | interface |
| 葉節點類別、效能關鍵、禁止擴充 | sealed class |
| 中間層鎖定特定行為、禁止進一步變化 | sealed override |
| 修正基類設計缺失、非多型情境 | new (隱藏) |
abstract 與 sealed 是繼承體系的兩極:一個要求必須擴充,一個禁止擴充。override、sealed override、abstract override、new 構成四種繼承語意,精準表達設計意圖。掌握它們,能建構清晰、安全且可演進的類別階層。