ภาพรวมคีย์เวิร์ดการสืบทอดและพฤติกรรมเมธอด
| คีย์เวิร์ด |
วัตถุประสงค์ |
ใช้ที่ |
ผลลัพธ์ |
| 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) - ใช้น้อยที่สุด