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

Virtual vs Sealed vs New vs Abstract ใน C#

ภาพรวมคีย์เวิร์ดการสืบทอดและพฤติกรรมเมธอด

คีย์เวิร์ด วัตถุประสงค์ ใช้ที่ ผลลัพธ์
virtual อนุญาตให้ Override ได้ Base Class Method Derived Class สามารถ Override
override เขียนทับ Virtual/Abstract Method Derived Class Method Polymorphism (Dynamic Dispatch)
sealed ห้าม Override / ห้ามสืบทอด Class หรือ Override Method จบจุดการ Override/Inherit
new ซ่อน Base Member (Hiding) Derived Class Member Static Binding (Non-polymorphic)
abstract บังคับให้ Derived Implement Class หรือ Method ต้อง Override ใน Derived Class

1. Virtual - เปิดโอกาสให้ Override

public class Animal {
    // Virtual Method - มี Default Implementation
    public virtual void MakeSound() {
        Console.WriteLine("Some sound...");
    }
}

public class Dog : Animal {
    // Override - เปลี่ยนพฤติกรรม
    public override void MakeSound() {
        Console.WriteLine("Woof!");
    }
}

2. Sealed - ปิดกั้นการ Override/Inherit

// Sealed Class - ไม่สามารถสืบทอดได้
public sealed class FinalClass {
    // ...
}

// Sealed Method - หยุดการ Override ต่อไป
public class Base {
    public virtual void Method() { }
}

public class Middle : Base {
    // Override และ Seal ไว้ - Derived Class ถัดไป Override ไม่ได้
    public sealed override void Method() { }
}

public class Derived : Middle {
    // public override void Method() { } // ❌ Compile Error!
}

3. New - Method Hiding (Shadowing)

public class Base {
    public void Show() {
        Console.WriteLine("Base.Show()");
    }
}

public class Derived : Base {
    // ซ่อน Base.Show() - ไม่ใช่ Override
    public new void Show() {
        Console.WriteLine("Derived.Show()");
    }
}

// การใช้งาน
Base b = new Derived();
b.Show(); // "Base.Show()" - เรียก Base Method! (Static Binding)

Derived d = new Derived();
d.Show(); // "Derived.Show()" - เรียก Derived Method

4. Abstract - บังคับ Implementation

// Abstract Class - ไม่สามารถ new ได้
public abstract class Shape {
    // Abstract Method - ไม่มี Body, บังคับ Override
    public abstract double Area();
    
    // Virtual Method - มี Default, Override ได้ถ้าอยาก
    public virtual void Draw() {
        Console.WriteLine("Drawing shape...");
    }
}

public class Circle : Shape {
    public double Radius { get; set; }
    
    // บังคับ Implement
    public override double Area() {
        return Math.PI * Radius * Radius;
    }
    
    // เลือก Override ได้
    public override void Draw() {
        Console.WriteLine("Drawing circle...");
    }
}

การรวมใช้งานร่วมกัน

public abstract class Vehicle {
    public abstract void Start();      // บังคับ Override
    
    public virtual void Stop() {       // มี Default, Override ได้
        Console.WriteLine("Vehicle stopping...");
    }
}

public class Car : Vehicle {
    public sealed override void Start() { // Override และ Seal
        Console.WriteLine("Car engine started");
    }
    
    public override void Stop() {
        Console.WriteLine("Car stopped");
    }
}

// public class SportsCar : Car {
//     public override void Start() { } // ❌ Error: Sealed!
// }

สรุปการเลือกใช้

  • virtual - ต้องการ Default Behavior แต่ให้ลูกเปลี่ยนได้
  • abstract - ต้องการบังคับให้ลูก Implement เอง (ไม่มี Default)
  • override - เขียนทับ Virtual/Abstract Method
  • sealed - หยุดการ Override/Inherit ตรงนี้
  • new - ซ่อน Member เดิม (ไม่ใช่ Polymorphism) - ใช้น้อยที่สุด