Page cover image

Method Overloading

นพศร แก้วเย็นฉ่ำ 650710557

Overloading Method หมายถึงอะไร? 🏕️

Overloading Method หมายถึงอะไร? 🏕️

คือ วิธีการทั่วไปในการนำ "Polymorphism" มาใช้ ซึ่งเป็นความสามารถในการกำหนดฟังก์ชันใหม่ในรูปแบบ มากกว่าหนึ่งรูปแบบ ที่สามารถนำฟังก์ชัน "Overloading" มาใช้ได้โดยการกำหนดการทำงานสองรายการขึ้นไปในคลาสที่มีชื่อ method เดียวกัน ตัว C# สามารถแยกแยะเมธอดที่มี พารามิเตอร์ของเมธอดต่างกันได้

พารามิเตอร์ของเมธอดต่างกันได้ หมายถึง เมธอดสามารถมีชื่อเดียวกันได้แต่มีการรับพารามิเตอร์ที่ต่างออกไปจากMethodเดิม เช่น "จำนวนพารามิเตอร์", "ลำดับของพารามิเตอร์", "ประเภทข้อมูลของพารามิเตอร์" ภายในคลาสเดียวกันหรือจะเกิดการ " Overloading " ระหว่าง " Parent Class " กับ " Sub Class " ได้เหมือนกัน

🚧🚧🚧🚧🚧 ตัวอย่างการสร้าง Method Overloading ด้วยC# 🚧🚧🚧🚧🚧

# Parent Class
using System;
class My_Parent{

    public void Display(int value_int){
    
        Console.WriteLine("Integer: " + value_int);
    }
    
    // Method Overloading เปลี่ยนการรับพารามิเตอร์จาก int เป็น String ภายใน class My_Parent 
    public void Display(string valueString){
    
        Console.WriteLine("String: " + value_String);
    }
    
}
# Sub Class
using System;
class My_Sub : My_Parent{

    // Method Overloading เปลี่ยนการรับพารามิเตอร์จาก int เป็น double และ ได้เพิ่มการรับพารามิเตอร์เพิ่ม ภายใน class My_Sub
    public void Display(double value_double, int number_int){
    
        Console.WriteLine("Double: " + value_double + " and Integer: "+ number_int);
    }

    // เรียกใช้งาน Method Overloading และ Method ตั้งต้น 
    public void CallDisplay(){
    
        Display(10);                //เรียกใช้ Display(int)
        Display("Hello Word");     // เรียกใช้ Display(string)
        Display(3.14,15);         // เรียกใช้ Display(double,int)
    }
}
# Main Class
using System;
class My_Main
{
    static void Main(string[] args){
    
        My_Sub obj = new My_Sub();
        obj.CallDisplay();
    }
}

🚧🚧🚧🚧🚧 Output ที่ได้หลังจากรันคำสั่งใน C# 🚧🚧🚧🚧🚧

ข้อควรระวังในการทำ Method Overloading ใน C#

เปรียบเทียบ Method Overloading ระหว่าง C# กับ Java, C, Python

🏜️ C#

C#
public class Main {
    // method ดั่งเดิม
    public void Display(int Number) { }
    
    //พารามิเตอร์รองรับการตั้งค่า default เริ่มตั้น
    // overloading ด้วยการเปลี่ยนชนิดของพารามิเตอร์ที่รับ
    public void Display(string b ="default") { }
    
    // overloading ด้วยการเพิ่มจำนวนพารามิเตอร์ที่ต้องการรับ
    public void Display(int Number, string Text) { }
}

🌄 Java

Java
public class Main {
    // method ดั่งเดิม
    public void Display(int Number) { }
    
    // overloading ด้วยการเปลี่ยนชนิดของพารามิเตอร์ที่รับ
    public void Display(String Text) { }
    
    // overloading ด้วยการเพิ่มจำนวนพารามิเตอร์ที่ต้องการรับ
    public void Display(int Number, String Text) { }
}

🚨🚨 จะเห็นได้ว่า ใน C# และ Java นั้นไม่ได้มีความต่างกันในเรื่องของการทำ " Overloading Method " เพราะทั้งใน C# และ Java มีการใช้ภาษาเชิงวัตถุ และมีการรองรับการใช้ " Overloading Method " อย่างเป็นที่ชัดเจน ในภาษา Java เรียกการทำ Overloading Method ว่า " Early Binding " 🚨🚨

🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧

🏔️ C

C
void displayInt(int number){

    printf("%d\n", number);
}

void displayChar(char character) {

    printf("%c\n", character);
}

🛑🛑 เนื่องในภาษา C ไม่มีการรองรับ การทำ " Overloading Method " เพราะ C ไม่เป็น ภาษาเชิงวัตถุ (Object-Oriented Programming) และอีกเหตุผลเป็นเพราะคอมไพเลอร์ไม่รองรับ จึงต้องใช้ชื่อในการสร้างฟังก์ชั่น (method) ที่แตกต่างกัน 🛑🛑

❗️❗️❗️ แต่หลังจาก มีการเพิ่มตัว " _Generic " มาใน C11 (รองรับใน GCC ตั้งแต่เวอร์ชัน 4.9) ก็ทำให้สามารถเรียกกาารใช้งานฟังก์ชั่นโดยที่ไม่ต้องเรียกฟังก์ชันที่มีชื่อแตกต่างกันที่ละตัว ❗️❗️❗️

#include <stdio.h>
// ทำการ สร้าง define ...ตั้งชื่อ...(พารามิเตอร์) _Generic(พารามิเตอร์)  
#define display(value) _Generic((value), \
    int: displayInt, \
    char: displayChar, \
    float: displayFloat \
)(value)

void displayInt(int number) {
    printf("Integer: %d\n", number);
}

void displayChar(char character) {
    printf("Character: %c\n", character);
}

void displayFloat(float float_number) {
    printf("Float: %.2f\n", float_number);
}

int main() {
char thischar = 'A';

//เห็นได้ว่าตอนสร้างจะมีชื่อที่ต้องต่างกัน แต่ตอนนำมาเรียกใช้งานอ้างอิงจากบันทัดที่ สร้าง _Generic ว่าจะตั้งชื่อให้ว่าอะไร
    display(10); 
    display(thischar);      
    display(3.14f);    
    return 0;
}

🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧

🏝️ Python

Python
def display(value):
    print(value)

🚨🚨 เดิมทีใน Python นั้นมีความหยืดหยุ่นทางการประกาศชนิดตัวแปร เพราะเป็น ภาษาแบบ " Dynamically typed language " ซึ่งจะไม่ได้มีการกำหนดชนิดข้อมูลตั้งแต่ตอนประกาศเหมือน C#, C, Java ทำให้การทำ " Overloading Method " ด้วยการเปลี่ยนการรับชนิดพารามิเตอร์นั้นไม่ได้จำเป็นมากนะ แต่ก็สามารถทำการกำหนดชนิดข้อมูลเช็คก่อนแล้วค่อยทำการรีเทิร์นค่าได้เหมือนกัน 🚨🚨

Python
def display(value):

 # ใช้ isinstance(object,classinfo) ถ้าชนิด object ตรงกับ classinfo ก็จะคืนค่า true
 # classinfo คือ ชนิดข้อมูล
 
 # ตรวจว่า value เป็น Integer หรือไม่
    if isinstance(value,int):
        print(value)
 # ตรวจว่า value เป็น String หรือไม่       
    elif isinstance(value,str):
        print(value)

🛑🛑 การเพิ่มจำนวนพารามิเตอร์ที่จะต้องการรับก็สามารถทำได้เเหมือนกันกับภาษา C# 🛑🛑

Python
def display(value):
    print(value)
    
    
# overloading ด้วยการเพิ่มจำนวนพารามิเตอร์ที่ต้องการรับ
def display(value1,value2):
    print(value1,value2)

Slides 🎑

Video 🌠

https://youtu.be/px_VXSGcAH8

Reference 🚝🗻

  • C#

- https://csharp.net-tutorials.com/th/119/classes/method-overloading/

-ใช้ข้อมูลในส่วนนิยาม Overloading Method ทั่วไป

- https://www.geeksforgeeks.org/c-sharp-method-overloading/

-ใช้หาความหมายของการทำ Overloading Method ใน C#

- https://www.w3schools.com/cs/cs_method_overloading.php

-ใช้เป็นตัวอย่างในการสร้าง Overloading Method ใน C#

- https://learn.microsoft.com/en-us/dotnet/standard/design-guidelines/member-

overloading

-ใช้หาหลักการในการทำ และ ข้อควรระวังในการทำ Method overloading ใน C#

-ใช้เป็นตัวอย่างในการสร้าง Overloading Method ใน C#

Last updated