Constructor Overloading

วรเมธ อภิวังโสกุล 650710580

Constructor Overloading ในภาษา C# คือการสร้าง Constructor อย่างน้อย 2 ตัวในคลาสเดียวกัน โดย C# สามารถแยก Constructor ที่มี Signatures ต่างกันได้ แต่ละตัวมีการรับพารามิเตอร์ต่างกัน เช่น จำนวนของพารามิเตอร์ (Number of Parameters) , ประเภทของพารามิเตอร์ (Types of Parameters) , ลำดับของพารามิเตอร์ (Order of Parameters)

Static Constructor ไม่สามารถ Overload ได้ เพราะเป็น Constructor ที่ไม่มีพารามิเตอร์ แต่สำหรับการ Overload จำเป็นต้องมี Constructor ที่มีพารามิเตอร์

Private Constructor สามารถ Overload ได้ และสามารถใช้เป็น Instance ของคลาสในคลาสเดียวกันได้ และไม่สามารถเข้าถึง Private Member จากภายนอกคลาสได้

ตัวอย่างเช่น :

1. จำนวนของพารามิเตอร์ต่างกัน (Different Number of Parameters)

using System;

class Fruit {

    // Constructor แบบมี 1 พารามิเตอร์
    public Fruit(string name) {
        Console.WriteLine("Name : " + name);
    }

    // Constructor แบบมี 2 พารามิเตอร์
    public Fruit(string color, int price) {
        Console.WriteLine("Color : " + color);
        Console.WriteLine("Price : " + price);
    }

}

class Program {
    static void Main() {
        Fruit f1 = new Fruit("Apple");  // มีพารามิเตอร์ 1 ตัว
        
        Fruit f2 = new Fruit("Red", 20);  // มีพารามิเตอร์ 2 ตัว
        
        Console.ReadLine();
    }
}

Output

Name : Apple
Color : Red
Price : 20

2. ประเภทของพารามิเตอร์ต่างกัน (Different Types of Parameters)

using System;

class Fruit {

    // Constructor เป็นแบบ string พารามิเตอร์
    public Fruit(string name) {
        Console.WriteLine("Name : " + name);
    }

    // Constructor เป็นแบบ int พารามิเตอร์
    public Fruit(int price) {
        Console.WriteLine("Price : " + price);
    }

}

class Program {
    static void Main() {
        Fruit f1 = new Fruit("Apple");  // string 
        
        Fruit f2 = new Fruit(20);  // int
        
        Console.ReadLine();
    }
}

Output

Name : Apple
Price : 20

3. ลำดับของพารามิเตอร์ต่างกัน (Different Order of Parameters)

using System;

class Fruit {

    // Constructor เป็นแบบ string,int พารามิเตอร์
    public Fruit(string name, int price) {
        Console.WriteLine("Name : " + name);
        Console.WriteLine("Price : " + price);
    }

    // Constructor เป็นแบบ int,string พารามิเตอร์
    public Fruit(int calories, string color) {
        Console.WriteLine("Calories(kcal) : " + calories);
        Console.WriteLine("Color : " + color);
    }

}

class Program {
    static void Main() {
        Fruit f1 = new Fruit("Apple",20);  // string , int
        
        Fruit f2 = new Fruit(52,"Red");  // int , string
        
        Console.ReadLine();
    }
}

Output

Name : Apple
Price : 20
Calories(kcal) : 52
Color : Red

การเปรียบเทียบกับภาษา Java/C++/Python

C#
Java
C++
Python

C# สามารถสร้าง

constructor หลายตัวใน class เดียวกันได้ โดยแต่ละ constructor จะมี signature ที่ต่างกัน ( เช่น จำนวน , ประเภทหรือลำดับของ parameter ) ซึ่งช่วยให้สร้าง object ด้วยวิธีที่หลากหลายได้

Java การ Constructor Overloading มีลักษณะการทำงานคล้ายกับ C# โดยสามารถสร้าง

constructor หลายตัวได้โดยการเปลี่ยนแปลงจำนวนหรือประเภทของ parameter

C++ มีการทำ Constructor Overloading

ได้เหมือนกับ C# , Java โดยใช้หลักการเดียวกันคือ การเปลี่ยนแปลงจำนวนหรือประเภท parameter ของ constructor แต่ละตัว

Python ไม่มีการ Constructor Overloading โดยตรง แต่สามารถจำลองการทำงานได้โดยใช้ค่าเริ่มต้น (Default Arguments) หรือตรวจสอบจำนวนพารามิเตอร์ที่รับเข้ามาในฟังก์ชัน __init__

Code ตัวอย่าง

using System;

class Fruit {

    // Constructor แบบมี 1 พารามิเตอร์
    public Fruit(string name) {
        Console.WriteLine("Name : " + name);
    }

    // Constructor แบบมี 2 พารามิเตอร์
    public Fruit(string color, int price) {
        Console.WriteLine("Color : " + color);
        Console.WriteLine("Price : " + price);
    }

}

class Program {
    static void Main() {
        Fruit f1 = new Fruit("Apple");  // เรียกใช้ Constructor ที่มีพารามิเตอร์ 1 ตัว
        
        Fruit f2 = new Fruit("Red", 20);  // เรียกใช้ Constructor ที่มีพารามิเตอร์ 2 ตัว
        
        Console.ReadLine();
    }
}

Output

Name : Apple
Color : Red
Price : 20

สรุปเปรียบเทียบ

คุณสมบัติ
C#
Java
C++
Python

การ Overloading

รองรับโดยตรง

รองรับโดยตรง

รองรับโดยตรง

ไม่รองรับโดยตรง (ต้องใช้ default parameters)

การเรียกใช้ Constructor

ชัดเจน ง่าย

คล้าย C#

ใช้ Syntax ที่คล้าย Java/C#

ใช้ if-else เพื่อตรวจสอบพารามิเตอร์

จากตารางจะเห็นว่า Python มีวิธีจัดการที่ต่างจากภาษาอื่น เนื่องจากไม่มีการรองรับ Constructor Overloading โดยตรง แต่การใช้ Default Parameters ก็ช่วยทำให้มีความยืดหยุ่นมากขึ้น ในขณะที่ C#, Java, และ C++ มีการ Constructor Overloading ที่ชัดเจนและง่ายต่อการใช้งานมากกว่า

ข้อดีของการ Overloading คือ

  • ประหยัดพื้นที่หน่วยความจำ , consistency และ readability

  • สามารถนำโค้ดมา reusability เพื่อประหยัดหน่วยความจำ

  • โปรแกรมทำงานได้เร็วขึ้น

  • การบำรุงรักษาโค้ดได้ง่าย

  • ลดการใช้ชื่อฟังก์ชันที่แตกต่างกันสำหรับการดำเนินการประเภทเดียวกัน

  • สามารถพัฒนาฟังก์ชันได้มากกว่าหนึ่งฟังก์ชันที่มีชื่อเดียวกัน แต่อาร์กิวเมนต์ที่ส่งผ่านควรเป็นประเภทที่แตกต่างกัน

ข้อเสียของการ Overloading คือ

  • การประกาศฟังก์ชันที่ต่างกันเฉพาะใน return type ไม่สามารถโอเวอร์โหลดได้

  • หากมีการประกาศฟังก์ชัน static member พารามิเตอร์เดียวกันหรือ name types เดียวกันจะไม่สามารถโอเวอร์โหลดได้

คลิปนำเสนอ

Presentation Silde

Referance

soumikmondal. (24 Mar, 2023). C# | Constructor Overloading. GeeksforGeeks. https://www.geeksforgeeks.org/c-sharp-constructor-overloading/

Javatpoint. (n.d.). C# Member Overloading. https://www.javatpoint.com/c-sharp-member-overloading

Programiz. (n.d.). C# Constructor Overloading. https://www.programiz.com/csharp-programming/constructor-overloading

w3schools. (n.d.). C# Method Overloading. https://www.w3schools.com/cs/cs_method_overloading.php

tutorialspoint. (n.d.). C# - Polymorphism. https://www.tutorialspoint.com/csharp/csharp_polymorphism.htm

GeeksforGeeks. (16 Jun, 2023). Constructor Overloading in Java. https://www.geeksforgeeks.org/constructor-overloading-java/

I.HARISH KUMAR. (14 Sep, 2023). Constructor Overloading in C++. GeeksforGeeks. https://www.geeksforgeeks.org/constructor-overloading-c/

sunderrcrqw. (01 Mar, 2024). Method And Constructor Overloading In Python. https://www.geeksforgeeks.org/method-and-constructor-overloading-in-python/

Last updated