การทำความเข้าใจเกี่ยวกับตัวสร้างพื้นฐานใน C#: คุณจำเป็นต้องเรียกใช้ตัวสร้างพื้นฐานโดยตรงหรือไม่?

เมื่อทำงานกับคลาสใน C# โดยเฉพาะอย่างยิ่งในการสืบทอด คำถามที่พบบ่อยคือ: ผมจำเป็นต้องเรียกใช้ตัวสร้างคลาสพื้นฐานโดยตรงหรือไม่ หรือ C# คอมไพเลอร์จะจัดการให้อัตโนมัติ? คำถามนี้มีความสำคัญทั้งสำหรับผู้เริ่มต้นและโปรแกรมเมอร์ที่มีประสบการณ์ เนื่องจากมีผลต่อลักษณะการทำงานของตัวสร้างในโปรแกรมเชิงวัตถุ

พื้นฐานของการสืบทอดและตัวสร้าง

ใน C# คลาสสามารถสืบทอดคุณลักษณะและวิธีการจากคลาสอื่น คลาสพื้นฐาน (หรือคลาสพ่อแม่) สามารถให้ฟังก์ชันการทำงานที่คลาสที่สืบทอด (หรือคลาสลูก) สามารถใช้ประโยชน์ได้ ในแง่ของตัวสร้าง:

  • ตัวสร้างพื้นฐาน: ตัวสร้างที่กำหนดไว้ในคลาสพื้นฐาน
  • ตัวสร้างที่สืบทอด: ตัวสร้างที่กำหนดไว้ในคลาสที่สืบทอด

โดยทั่วไปเมื่อคุณสร้างอินสแตนซ์ของคลาสที่สืบทอด คุณอาจสมมติว่าตัวสร้างคลาสพื้นฐานจะถูกเรียกใช้ก่อน รู้ว่าเมื่อไหร่และอย่างไรจึงเป็นกุญแจสำคัญในการเขียนโค้ด C# ที่มีประสิทธิภาพ

การเรียกใช้ตัวสร้างโดยนัยและโดยชัดเจน

เมื่อคุณสร้างอินสแตนซ์ของคลาสที่สืบทอดใน C# ตัวสร้างคลาสพื้นฐานจะถูกเรียกใช้โดยอัตโนมัติ เว้นแต่คลาสที่สืบทอดจะระบุอย่างชัดเจนว่าต้องการเรียกใช้ตัวสร้างพื้นฐานอื่น

การเรียกใช้โดยนัย

ในตัวอย่างด้านล่าง ตัวสร้าง BaseClass จะถูกเรียกใช้โดยนัยเมื่อ MyClass ถูกสร้างขึ้น:

class BaseClass
{
    public BaseClass()
    {
        // โค้ดการเริ่มต้น
    }
}

class MyClass : BaseClass
{
    public MyClass() // เรียกใช้ BaseClass() โดยนัย
    {
        // โค้ดการเริ่มต้น
    }
}

ในกรณีนี้เมื่อคุณสร้างอ็อบเจ็กต์ของ MyClass ตัวสร้าง BaseClass จะถูกเรียกใช้อัตโนมัติ

การเรียกใช้โดยชัดเจน

แม้ว่าคุณสามารถพึ่งพาการเรียกใช้โดยนัยสำหรับตัวสร้างเริ่มต้นได้ แต่ก็มีสถานการณ์ที่คุณอาจต้องการระบุว่าต้องการเรียกใช้ตัวสร้างพื้นฐานตัวใด คุณสามารถทำได้โดยใช้ไวยากรณ์ : base()

class BaseClass
{
    public BaseClass(int value)
    {
        // โค้ดการเริ่มต้นโดยใช้ value
    }
}

class MyClass : BaseClass
{
    public MyClass() : base(10) // เรียกใช้ BaseClass(int value)
    {
        // โค้ดการเริ่มต้น
    }
}

ในตัวอย่างข้างต้น การเรียกใช้โดยชัดเจนจะมั่นใจได้ว่าตัวสร้าง BaseClass ที่รับค่าเป็นจำนวนเต็มจะถูกใช้งาน

การตรวจสอบการเรียกใช้ตัวสร้าง

หากคุณสงสัยเกี่ยวกับการทำงานนี้ในทางปฏิบัติ คุณสามารถสร้างแอปพลิเคชันคอนโซลเล็ก ๆ เพื่อตรวจดูพฤติกรรมด้วยตนเอง

using System;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            MyClass foo = new MyClass();
            Console.ReadLine();
        }
    }

    class BaseClass
    {
        public BaseClass()
        {
            Console.WriteLine("เรียกใช้ตัวสร้าง BaseClass.");
        }
    }

    class MyClass : BaseClass
    {
        public MyClass()
        {
            Console.WriteLine("เรียกใช้ตัวสร้าง MyClass.");
        }
    }
}

คำอธิบายผลลัพธ์

เมื่อคุณรันโปรแกรมนี้ คุณจะเห็น:

เรียกใช้ตัวสร้าง BaseClass.
เรียกใช้ตัวสร้าง MyClass.

นี่ยืนยันว่าตัวสร้างของคลาสพื้นฐานจะถูกเรียกใช้อัตโนมัติก่อนที่จะเรียกใช้ตัวสร้างของคลาสที่สืบทอด

บทสรุป

สรุปได้ว่าคุณ ไม่จำเป็นต้องเรียกใช้ตัวสร้างพื้นฐานโดยชัดเจนใน C# หากคุณใช้ตัวสร้างเริ่มต้นปกติ อย่างไรก็ตามหากคุณต้องการใช้ตัวสร้างพิเศษจากคลาสพื้นฐาน คุณจะต้องระบุอย่างชัดเจนด้วย : base() การเข้าใจรายละเอียดเหล่านี้ช่วยให้โค้ดของคุณสะอาดและมีประสิทธิภาพมากขึ้นในขณะที่ใช้พลังของการสืบทอดใน C#

โดยการคำนึงถึงหลักการเหล่านี้ คุณสามารถนำทางความซับซ้อนของโปรแกรมเชิงวัตถุใน C# ได้อย่างมั่นใจ