Method Overloading
นพศร แก้วเย็นฉ่ำ 650710557
Overloading Method หมายถึงอะไร? 🏕️
Overloading Method หมายถึงอะไร? 🏕️
คือ วิธีการทั่วไปในการนำ "Polymorphism" มาใช้ ซึ่งเป็นความสามารถในการกำหนดฟังก์ชันใหม่ในรูปแบบ มากกว่าหนึ่งรูปแบบ ที่สามารถนำฟังก์ชัน "Overloading" มาใช้ได้โดยการกำหนดการทำงานสองรายการขึ้นไปในคลาสที่มีชื่อ method เดียวกัน ตัว C# สามารถแยกแยะเมธอดที่มี พารามิเตอร์ของเมธอดต่างกันได้
พารามิเตอร์ของเมธอดต่างกันได้ หมายถึง
เมธอดสามารถมีชื่อเดียวกันได้แต่มีการรับพารามิเตอร์ที่ต่างออกไปจากMethodเดิม เช่น "จำนวนพารามิเตอร์", "ลำดับของพารามิเตอร์", "ประเภทข้อมูลของพารามิเตอร์" ภายในคลาสเดียวกันหรือจะเกิดการ " Overloading " ระหว่าง " Parent Class " กับ " Sub Class " ได้เหมือนกัน
🚧🚧🚧🚧🚧 ตัวอย่างการสร้าง Method Overloading ด้วยC# 🚧🚧🚧🚧🚧
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);
}
}
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)
}
}
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#
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
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
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
def display(value):
print(value)
🚨🚨 เดิมทีใน Python นั้นมีความหยืดหยุ่นทางการประกาศชนิดตัวแปร เพราะเป็น ภาษาแบบ
" Dynamically typed language " ซึ่งจะไม่ได้มีการกำหนดชนิดข้อมูลตั้งแต่ตอนประกาศเหมือน C#, C, Java ทำให้การทำ " Overloading Method " ด้วยการเปลี่ยนการรับชนิดพารามิเตอร์นั้นไม่ได้จำเป็นมากนะ แต่ก็สามารถทำการกำหนดชนิดข้อมูลเช็คก่อนแล้วค่อยทำการรีเทิร์นค่าได้เหมือนกัน 🚨🚨
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# 🛑🛑
def display(value):
print(value)
# overloading ด้วยการเพิ่มจำนวนพารามิเตอร์ที่ต้องการรับ
def display(value1,value2):
print(value1,value2)
Slides 🎑
Video 🌠
https://youtu.be/px_VXSGcAH8
Reference 🚝🗻
Last updated