คีย์เวิร์ด abstract คืออะไร?
คีย์เวิร์ด abstract ใน C# ใช้สำหรับประกาศ คลาสนามธรรม (abstract class) และ เมธอดนามธรรม (abstract method)
ลักษณะสำคัญของ Abstract Class
- ประกอบด้วยเมธอดนามธรรมและเมธอดทั่วไปได้
- ไม่สามารถสร้างอินสแตนซ์ได้โดยตรง
- ต้องมีคลาสลูกมาสืบทอดและ implement เมธอดนามธรรม
- ใช้สำหรับกำหนดโครงสร้างพื้นฐาน (contract) ให้คลาสลูกปฏิบัติ
ตัวอย่าง Abstract Class และ Abstract Method
public abstract class Vehicle
{
public abstract void Display(); // เมธอดนามธรรม - ไม่มี body
// เมธอดทั่วไป - มี implementation
public void StartEngine()
{
Console.WriteLine("เริ่มต้นเครื่องยนต์...");
}
}
การ Implement ในคลาสลูก (Derived Classes)
คลาสนามธรรม Vehicle มีคลาสลูก 3 คลาส ได้แก่ Bus, Car, Motorcycle
การ implement ของคลาส Car
public class Car : Vehicle
{
public override void Display()
{
Console.WriteLine("Car");
}
}
ตัวอย่างโค้ดสมบูรณ์
using System;
public abstract class Vehicle
{
public abstract void Display();
}
public class Bus : Vehicle
{
public override void Display()
{
Console.WriteLine("Bus");
}
}
public class Car : Vehicle
{
public override void Display()
{
Console.WriteLine("Car");
}
}
public class Motorcycle : Vehicle
{
public override void Display()
{
Console.WriteLine("Motorcycle");
}
}
public class Program
{
public static void Main()
{
Vehicle v;
v = new Bus();
v.Display();
v = new Car();
v.Display();
v = new Motorcycle();
v.Display();
}
}
ผลลัพธ์
Bus
Car
Motorcycle
Abstract Method vs Virtual Method
| คุณสมบัติ | Abstract Method | Virtual Method |
|---|---|---|
| มี body หรือไม่ | ไม่มี (ต้อง override) | มี (override ได้แต่ไม่บังคับ) |
| คีย์เวิร์ด | abstract | virtual |
| ในคลาสลูก | บังคับ override | เลือก override ได้ |
| คลาสแม่ | ต้องเป็น abstract class | เป็น abstract หรือปกติได้ |
เมื่อไหร่ควรใช้ Abstract Class?
- ต้องการกำหนดโครงสร้างพื้นฐานที่คลาสลูกต้องปฏิบัติ
- มีโค้ดร่วม (shared code) ที่คลาสลูกใช้ร่วมกัน
- ต้องการควบคุมการสร้างออบเจกต์ (ไม่ให้ new ตรงๆ)
- สร้าง hierarchy ที่ชัดเจน เช่น Shape → Circle, Rectangle
ข้อจำกัด
- ไม่สามารถใช้
abstractกับ struct ได้ - ไม่สามารถใช้
abstractกับ sealed class ได้ (ขัดแย้งกัน) - abstract method ไม่สามารถเป็น private ได้ (ต้องเป็น protected, internal, หรือ public)
- static method ไม่สามารถเป็น abstract ได้