C# ไม่มีคีย์เวิร์ด final เหมือน Java ใช้ sealed แทนสำหรับห้าม Override เมธอด
1. Private Methods
เหมือนกันกับบทความก่อนหน้า — เข้าถึงได้เฉพาะในคลาสเดียวกัน
2. Sealed Methods (Final Methods)
ใช้ sealed override เพื่อห้ามให้ลูกคลาส Override ต่อไป
เงื่อนไข
- ต้องเป็น
overrideเมธอด (คือ Override มาจาก Base Class แล้ว) - อยู่ใน Derived Class (ไม่ใช่ Base Class ตรงๆ)
- Base Method ต้องเป็น
virtualหรือabstract
ตัวอย่าง: Sealed Method
using System;
class BaseClass {
public virtual void Display() {
Console.WriteLine("BaseClass");
}
}
class DerivedClass : BaseClass {
// Override และ Seal — ลูกคลาสต่อไป Override ไม่ได้
public sealed override void Display() {
Console.WriteLine("DerivedClass: Sealed Method");
}
}
class FurtherDerived : DerivedClass {
// ❌ Compile Error: Cannot override sealed member
// public override void Display() {
// Console.WriteLine("FurtherDerived");
// }
}
class Program {
static void Main() {
BaseClass b = new BaseClass();
b.Display(); // BaseClass
DerivedClass d = new DerivedClass();
d.Display(); // DerivedClass: Sealed Method
BaseClass poly = new DerivedClass();
poly.Display(); // DerivedClass: Sealed Method (Polymorphism ทำงาน)
Console.ReadKey();
}
}
Sealed Class
ใช้ sealed กับ Class เพื่อห้ามสืบทอด (Inherit) ทั้งหมด:
public sealed class FinalClass {
public void Method() { }
}
// class Derived : FinalClass { } // ❌ Compile Error
สรุปการเปรียบเทียบ Java vs C#
| Java | C# | คำอธิบาย |
|---|---|---|
final method | sealed override | ห้าม Override ต่อ |
final class | sealed class | ห้าม Inherit |
final variable | readonly (field) / const (compile-time) | ค่าคงที่ |
private method | private method | เข้าถึงได้เฉพาะในคลาส |
เมื่อไหร่ควรใช้ Sealed
- Library Author: ป้องกันการ Override ที่อาจทำลาย Invariant
- Performance: JIT สามารถ Devirtualize Call ได้ (Inline)
- Security: ป้องกัน Malicious Subclassing
- Design: แสดงเจตนาชัดเจนว่า "Class/Method นี้สมบูรณ์ ไม่ควรขยาย"