| 用法 | 語法 | 效果 |
|---|---|---|
| 密封類別 | sealed class MyClass | 禁止被繼承,不可與 abstract 共存 |
| 密封成員 | sealed override void Method() | 禁止後續衍生類別覆寫,必須搭配 override |
using System;
class A {
public virtual void F() => Console.WriteLine("A.F");
public virtual void G() => Console.WriteLine("A.G");
}
class B : A {
public sealed override void F() => Console.WriteLine("B.F"); // 密封 F
public override void G() => Console.WriteLine("B.G");
}
class C : B {
// 錯誤:無法覆寫 sealed 方法 F
// public override void F() { }
public override void G() => Console.WriteLine("C.G"); // 僅能覆寫 G
}
class Program {
static void Main() {
new A().F(); // A.F
new A().G(); // A.G
new B().F(); // B.F
new B().G(); // B.G
new C().F(); // B.F (繼承 B 的密封實作)
new C().G(); // C.G
Console.ReadKey();
}
}
A.F
A.G
B.F
B.G
B.F
C.G
A: F(virtual), G(virtual) ↓ 繼承 B: F(sealed override), G(override) ↓ 繼承 C: F(繼承 B 的 sealed), G(override)
private virtual 非法;密封針對繼承鏈,private 針對存取可見性non-sealed,除非有強烈理由non-virtual,需要多型才 virtual,確定終點才 sealed<remarks>Sealed because...</remarks>微基準測試顯示 sealed 方法內聯優化在 .NET Core 3.1+ / .NET 5+ 已極難測量。選擇 sealed 應基於設計意圖,而非效能。