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

การ Override (ลับทับ) เมธอดใน C#

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 overrideOverride แล้วห้าม 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!