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

คีย์เวิร์ด abstract ใน C# คู่มือฉบับสมบูรณ์

คีย์เวิร์ด 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 ได้