การทำความเข้าใจเกี่ยวกับตัวสร้างพื้นฐานใน 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# ได้อย่างมั่นใจ