C# ไม่มี final — ใช้ sealed แทน สำหรับ Class และ Method
1. sealed Class — ห้ามสืบทอด (Inherit)
public sealed class FinalClass {
public void DoSomething() { }
}
// class Derived : FinalClass { } // ❌ Compile Error: Cannot derive from sealed class
- ใช้เมื่อ: Class เสร็จสมบูรณ์ ไม่ควรขยาย, Security, Performance (Devirtualization)
- Struct เป็น sealed โดยอัตโนมัติ (ไม่สามารถ Inherit ได้)
2. sealed Method — ห้าม Override ต่อ
ต้องเป็น override เมธอด (Override มาจาก Base แล้ว) ถึงจะ Seal ได้
class BaseClass {
public virtual void Display() {
Console.WriteLine("BaseClass");
}
}
class DerivedClass : BaseClass {
// Override และ Seal
public sealed override void Display() {
Console.WriteLine("DerivedClass: Sealed");
}
}
class FurtherDerived : DerivedClass {
// public override void Display() { } // ❌ Compile Error
}
3. sealed + override ต้องไปคู่กัน
class Base {
public virtual void Method() { }
}
class Middle : Base {
public sealed override void Method() { } // ✅ OK: Override + Seal
}
class Leaf : Middle {
// public override void Method() { } // ❌ Error
}
ตัวอย่างครบถ้วน
using System;
class ClassOne {
public virtual void Display() {
Console.WriteLine("BaseClass");
}
}
class ClassTwo : ClassOne {
public sealed override void Display() {
Console.WriteLine("ClassTwo: DerivedClass (Sealed)");
}
}
class ClassThree : ClassTwo {
// public override void Display() { // ❌ Error: Cannot override sealed member
// Console.WriteLine("ClassThree");
// }
}
class Program {
static void Main() {
ClassOne baseRef = new ClassThree(); // Polymorphism
baseRef.Display(); // Calls ClassTwo.Display (Sealed)
Console.ReadKey();
}
}
Java vs C# Mapping
| Java | C# | Note |
|---|---|---|
final class | sealed class | Prevent Inheritance |
final method | sealed override | Prevent Further Override |
final variable | readonly / const | Immutable Field |
เมื่อไหร่ควรใช้ sealed
- Library Design: ป้องกัน Subclassing ที่อาจทำลาย Invariant
- Performance: JIT สามารถ Devirtualize/Inline ได้ (Virtual Call Overhead = 0)
- Security: ป้องกัน Malicious Override
- Design Intent: Communicate "Complete, Not for Extension"
⚠️ ข้อจำกัด
- ไม่สามารถ
sealedMethod ที่ไม่ใช่overrideได้ (Base Class ใช้sealedกับ Class แทน) - Static Method ไม่สามารถ
virtual/override/sealedได้