Mengalikan dua bilangan int dan mengalikan dua bilangan double adalah operasi yang sama secara makna, tetapi tipenya berbeda. Memberi nama berbeda seperti KalikanInt dan KalikanDouble memaksa pemanggil menghafal banyak nama untuk satu tugas. Method overloading memberi jalan keluarnya: satu nama method boleh dipakai beberapa kali, asalkan daftar parameternya berbeda.
Aturan Signature #
Signature sebuah method terdiri atas nama dan daftar parameternya (jumlah, tipe, dan urutannya). Aturan overloading:
- Dua method boleh bernama sama bila signature keduanya berbeda.
- Perbedaan return type saja tidak cukup; compiler menolak dua method dengan parameter identik.
- Pemilihan overload terjadi saat kompilasi berdasarkan tipe argument pada titik panggilan (overload resolution).
Jumlah overload tidak dibatasi dua: satu nama method boleh dipakai tiga, empat, atau lebih sepanjang tidak ada dua signature yang identik. Semakin banyak overload, semakin banyak bentuk panggilan yang ditanggung dokumentasi, jadi tambahkan hanya yang benar-benar dibutuhkan pemanggil.
Contoh Lengkap #
static class Kalkulator
{
public static int Kalikan(int a, int b)
{
return a * b;
}
public static double Kalikan(double a, double b)
{
return a * b;
}
public static int Kalikan(int a, int b, int c)
{
return a * b * c;
}
}
Console.WriteLine(Kalkulator.Kalikan(4, 5));
Console.WriteLine(Kalkulator.Kalikan(2.5, 4.0));
Console.WriteLine(Kalkulator.Kalikan(2, 3, 4));Output yang Dihasilkan:
20
10
24Mari kita bedah tiga panggilan tersebut:
- Baris 19 (
Kalikan(4, 5)): kedua argument bertipeint, sehingga compiler memilihKalikan(int, int)dan menghasilkan20. - Baris 20 (
Kalikan(2.5, 4.0)): kedua argument bertipedouble, sehingga overload kedua yang terpilih dan menghasilkan10. - Baris 21 (
Kalikan(2, 3, 4)): jumlah argument tiga, sehingga versi tiga parameter yang terpilih dan menghasilkan24.
Argument campuran pun tertangani: panggilan Kalkulator.Kalikan(4, 2.5) tidak punya pasangan int, double, tetapi 4 dapat dikonversi secara implicit ke double, sehingga compiler memilih Kalikan(double, double):
Console.WriteLine(Kalkulator.Kalikan(4, 2.5));Output yang Dihasilkan:
10Batasan: Return Type Saja Tidak Cukup #
Dua method berikut tidak dapat dikompilasi, karena parameternya identik dan hanya return type-nya berbeda:
public static int Kalikan(int a, int b)
{
return a * b;
}
public static double Kalikan(int a, int b) // hanya return type yang berbeda
{
return a * b;
}Hasil build nyata dari kode di atas (path project dipangkas agar ringkas):
Program.cs(10,26): error CS0111: Type 'Kalkulator' already defines a member called 'Kalikan' with the same parameter typesPesan galat CS0111 muncul karena saat pemanggilan Kalikan(4, 5), compiler tidak akan punya cara menentukan versi mana yang dimaksud. Overloading yang sehat membedakan parameter, bukan return type.