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:

  1. Dua method boleh bernama sama bila signature keduanya berbeda.
  2. Perbedaan return type saja tidak cukup; compiler menolak dua method dengan parameter identik.
  3. 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 #

csharp
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:

text
20
10
24

Mari kita bedah tiga panggilan tersebut:

  1. Baris 19 (Kalikan(4, 5)): kedua argument bertipe int, sehingga compiler memilih Kalikan(int, int) dan menghasilkan 20.
  2. Baris 20 (Kalikan(2.5, 4.0)): kedua argument bertipe double, sehingga overload kedua yang terpilih dan menghasilkan 10.
  3. Baris 21 (Kalikan(2, 3, 4)): jumlah argument tiga, sehingga versi tiga parameter yang terpilih dan menghasilkan 24.

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):

csharp
Console.WriteLine(Kalkulator.Kalikan(4, 2.5));

Output yang Dihasilkan:

text
10

Batasan: Return Type Saja Tidak Cukup #

Dua method berikut tidak dapat dikompilasi, karena parameternya identik dan hanya return type-nya berbeda:

csharp
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):

text
Program.cs(10,26): error CS0111: Type 'Kalkulator' already defines a member called 'Kalikan' with the same parameter types

Pesan 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.