Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

คีย์เวิร์ด final ใน C# (sealed)

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

JavaC#Note
final classsealed classPrevent Inheritance
final methodsealed overridePrevent Further Override
final variablereadonly / constImmutable Field

เมื่อไหร่ควรใช้ sealed

  • Library Design: ป้องกัน Subclassing ที่อาจทำลาย Invariant
  • Performance: JIT สามารถ Devirtualize/Inline ได้ (Virtual Call Overhead = 0)
  • Security: ป้องกัน Malicious Override
  • Design Intent: Communicate "Complete, Not for Extension"

⚠️ ข้อจำกัด

  • ไม่สามารถ sealed Method ที่ไม่ใช่ override ได้ (Base Class ใช้ sealed กับ Class แทน)
  • Static Method ไม่สามารถ virtual/override/sealed ได้