Method Overriding เป็นกลไกของ Runtime Polymorphism (Dynamic Binding) ที่คลาสลูก (Derived Class) ให้การทำงานใหม่แก่เมธอดที่สืบทอดมาจากคลาสแม่ (Base Class)
เงื่อนไขการ Override
- เมธอดใน Base Class ต้องมี
virtual,abstract, หรือoverride - เมธอดใน Derived Class ต้องใช้คีย์เวิร์ด
override - ลายเซ็น (Signature) ต้องเหมือนกันทุกประการ (ชื่อ, พารามิเตอร์, ประเภทคืนค่า)
- Access modifier ต้องไม่จำกัดกว่าเดิม (เช่น protected → public ได้ แต่ public → private ไม่ได้)
ตัวอย่าง: Abstract Class และ Override
using System;
namespace PolymorphismApplication {
// Abstract base class
abstract class Shape {
public abstract int Area(); // บังคับให้ลูกคลาส implement
}
class Rectangle : Shape {
private int length, width;
public Rectangle(int a = 0, int b = 0) {
length = a; width = b;
}
// Override abstract method
public override int Area() {
Console.WriteLine("Rectangle class area:");
return width * length;
}
}
class RectangleTester {
static void Main(string[] args) {
Shape shape = new Rectangle(10, 7); // Polymorphism: Shape reference ชี้ Rectangle object
double area = shape.Area(); // เรียก Rectangle.Area() จริง (Dynamic binding)
Console.WriteLine("Area: {0}", area);
Console.ReadKey();
}
}
}
Virtual vs Abstract vs Override
| คีย์เวิร์ด | คำอธิบาย |
|---|---|
virtual | มีการทำงานเริ่มต้น แต่อนุญาตให้ลูกคลาส Override ได้ |
abstract | ไม่มี Body บังคับให้ลูกคลาส Override (คลาสต้องเป็น abstract ด้วย) |
override | ให้การทำงานใหม่แทนที่ Base implementation |
sealed override | Override แล้วห้าม Override อีกในลูกคลาสถัดไป |
Overriding กับ Method Hiding (Shadowing)
ใช้ new แทน override จะเป็น Method Hiding — ไม่ใช่ Polymorphism
class Base { public virtual void Show() => Console.WriteLine("Base"); }
class Derived : Base {
public new void Show() => Console.WriteLine("Derived"); // Hiding
}
Base b = new Derived();
b.Show(); // แสดง "Base" — ไม่ใช่ Polymorphism!