
Overloading of Constructors
ณัฐฌา อย่าเคลิ้มจิตร์ 650710542
Constructor Overloading
มีความคล้ายๆกับ Method Overloading คือการสร้าง constructor หลายตัวในคลาสเดียวกัน แต่มีพารามิเตอร์ที่แตกต่างกัน ซึ่งช่วยให้เราสามารถเรียกใช้งาน constructor ที่แตกต่างกันตามลักษณะของข้อมูลที่เราส่งเข้ามาได้ อาจจะต่างกันที่จำนวนของพารามิเตอร์ หรือ ชนิดของพารามิเตอร์ โดย constructor แต่ละตัว จะถูกเลือกใช้งานตามประเภทของพารามิเตอร์ที่ส่งเข้ามาเมื่อสร้าง object
Ambiguous overloads
เกิดขึ้นเมื่อคอมไพเลอร์ไม่สามารถตัดสินได้ว่าจะเรียกใช้ constructor ตัวใดที่ถูกต้อง เนื่องจากมี constructor ที่มีชื่อเดียวกันหลายตัว แต่ลักษณะของพารามิเตอร์ที่ส่งเข้ามาทำให้คอมไพเลอร์ไม่สามารถแยกแยะได้อย่างชัดเจนว่าควรเลือกใช้อันไหน
ตัวอย่าง
using System;
class Example
{
public Example(int a)
{
Console.WriteLine("Constructor with int");
}
public Example(double a)
{
Console.WriteLine("Constructor with double");
}
}
class Program
{
static void Main()
{
Example ex = new Example(5.0f); // Ambiguous overload
}
}ในตัวอย่างนี้ constructor ตัวแรก Example(int a) รับพารามิเตอร์ประเภท int และ constructor ตัวที่สอง Example(double a) รับพารามิเตอร์ประเภท double เมื่อเราสร้างอินสแตนซ์ Example โดยส่งค่า 5.0f ซึ่งเป็นค่า float คอมไพเลอร์สามารถแปลงค่า float เป็น int ได้โดย implicit conversion เพื่อใช้คอนสตรัคเตอร์ตัวแรก และ ใน double ก็สามารถทำได้เช่นกัน เนื่องจากทั้งสอง constructor สามารถรับค่าที่ส่งเข้ามาได้ทั้งคู่ คอมไพเลอร์จึงไม่สามารถเลือก constructor ที่เหมาะสมได้ ทำให้เกิดปัญหา Ambiguous Overload ขึ้น
วิธีแก้ปัญหา
ประโยชน์ของ Overloading Constructor
การใช้ overloading constructor เป็นการเพิ่มความยืดหยุ่นให้กับ class โดยสามารถสร้าง objects ที่พร้อมใช้งานในสถานะต่างๆ โดยไม่ต้องกำหนดค่าผ่าน method อื่นๆ หลังจากสร้าง object นอกจากนี้ยังช่วยลดความซับซ้อนของโค้ดและลดโอกาสในการเกิดข้อผิดพลาด
ตัวอย่างการ Overloading Constructor
1.By changing the number of the parameters
จากตัวอย่าง คลาสนี้มีชื่อว่า Multiple ซึ่งมี constructor สองตัว ใน constructor ตัวแรกมีพารามิเตอร์ 2 ตัว และใน constructor ตัวที่สองมีพารามิเตอร์ 3 ตัว ซึ่งประเภทของข้อมูลของ constructor ทั้งสองตัวเป็น int เหมือนกันทุกตัว จึงต่างกันแค่จำนวนของพารามิเตอร์
2.By changing the Data types of the parameters
จากตัวอย่าง คลาสนี้มีชื่อว่า ADD ใน constructor ตัวแรกมีพารามิเตอร์เป็น int และ double ส่วน constructor ตัวที่สอง มีพารามิเตอร์เป็น int และ string ซึ่งจะเห็นได้ว่าจำนวนของพารามิเตอร์เท่ากัน แต่ชนิดของพารามิเตอร์ต่างกัน
3.By changing the Order of the parameters
จากตัวอย่าง คลาสนี้มีชื่อว่า student จะเห็นได้ว่ามี constructor สองตัว ทั้งสองตัวมีพารามิเตอร์ที่ชนิดตัวแปรเหมือนกัน แต่ลำดับต่างกัน คอมไพเลอร์ก็จะเรียกใช้ constructor ตามลำดับของพารามิเตอร์
4.Invoke an Overloaded Constructor using “this” keyword
จากตัวอย่าง คลาสนี้มีชื่อว่า volume ซึ่งมี constructor สามตัว ประกอบด้วย
First parameters
เป็น default constructor คือไม่มีพารามิเตอร์
จะถูกเรียกเมื่อสร้าง object volume โดยไม่ส่งค่าอะไรเข้าไป
และจะพิมพ์ข้อความว่า "Default Constructor"
Second parameters
รับพารามิเตอร์สองตัวคือ int กับ double
มีการใช้ this() เป็นการเรียก default constructor ก่อนจะทำงานของตัวมันเอง จะทำให้ข้อความ "Default Constructor " ถูกพิมพ์ออกมาก่อน แล้วตามด้วยข้อความ "Second Constructor"
จะถูกเรียกใช้เมื่อมีการสร้าง object volume ที่รับค่า (int,double)
Third parameters
รับพารามิเตอร์สามตัว คือ int,double และ int
มีการใช้ this(l, w) เพื่อเรียก Constructor ที่สอง ซึ่งจะทำการพิมพ์ข้อความ "Second Constructor" ตามด้วยข้อความ "Third Constructor"
จะถูกเรียกใช้เมื่อมีการสร้าง object volume ที่รับค่า (int,double,int)
ใน Method Main มีการสร้างobject ของคลาส volume ชื่อ g ด้วยพารามิเตอร์ 3 ตัว (20, 40.5, 60) เป็นการเรียกใช้ constructor ที่มีพารามิเตอร์ 3 ตัว constructor นี้จะเรียกใช้ constructor ที่มีพารามิเตอร์ 2 ตัวก่อน โดยผ่าน this(l, w) constructor ที่มีพารามิเตอร์ 2 ตัวก็จะเรียกใช้ constructor ที่ไม่มีพารามิเตอร์ก่อนผ่าน this() หลังจากนั้นจึงกำหนดค่าให้กับ Length, Width และ Height ตามลำดับ และคำนวณปริมาตรจากการเรียกใช้ g.result()
Constructor Overloading ใน C# ต่างจากภาษาอื่นอย่างไร?
C#
Java
ในภาษา java การ overloading constructor คล้ายกับ C# โดย constructor แต่ละตัวจะต้องมีพารามิเตอร์ที่แตกต่างกัน
Python
ในภาษา Python constructor ถูกกำหนดโดยใช้ฟังก์ชัน __init__ และการ overload constructor จะทำได้โดยการกำหนดพารามิเตอร์เริ่มต้นให้กับฟังก์ชัน __init__
C
ในภาษา C ไม่มีแนวคิดของ Constructor Overloading เพราะ C เป็นภาษาที่ไม่มีการสนับสนุน OOP แต่สามารถสร้างฟังก์ชันที่ทำหน้าที่คล้ายกับ constructor และทำการ overload ได้
Slide
Reference
Last updated

