Overloading (overloading) adalah kemampuan mendeklarasikan beberapa metode dengan nama sama di dalam satu kelas selama daftar parameternya berbeda. Topik ini membahas aturan signature (signature), cara kompilator memilih overloading yang tepat, serta tiga fasilitas yang melengkapi pemanggilan metode, yaitu argumen opsional, argumen bernama, dan parameter params. Setelah topik ini, nama metode dapat dipertahankan sederhana meskipun bentuk pemanggilannya beragam.
Program utuh dengan beberapa overloading#
Program berikut menghimpun tiga overloading Jumlahkan dan dua overloading Tampilkan di dalam satu kelas static. Salin programnya ke berkas Program.cs, lalu jalankan dengan dotnet run --file Program.cs.
// Overloading: satu nama metode dengan beberapa signature di dalam satu kelas.
Console.WriteLine(Kalkulator.Jumlahkan(2, 3));
Console.WriteLine(Kalkulator.Jumlahkan(2, 3, 4));
Console.WriteLine(Kalkulator.Jumlahkan(10, 20, 30, 40));
Kalkulator.Tampilkan(42);
Kalkulator.Tampilkan("empat puluh dua");
// Kelas static mengelompokkan metode pembantu dengan nama yang sama.
static class Kalkulator
{
// Overloading pertama dari metode Jumlahkan.
public static int Jumlahkan(int a, int b) => a + b;
// Overloading kedua dari metode Jumlahkan.
public static int Jumlahkan(int a, int b, int c) => a + b + c;
// Overloading ketiga dari metode Jumlahkan.
public static int Jumlahkan(int a, int b, int c, int d) => a + b + c + d;
// Overloading metode Tampilkan untuk parameter int.
public static void Tampilkan(int nilai) => Console.WriteLine($"int: {nilai}");
// Overloading metode Tampilkan untuk parameter string.
public static void Tampilkan(string nilai) => Console.WriteLine($"string: {nilai}");
}5
9
100
int: 42
string: empat puluh duaSetiap pemanggilan menemukan overloading dengan jumlah dan tipe parameter yang cocok, sehingga Jumlahkan(2, 3) menghasilkan 5 dan Tampilkan("empat puluh dua") memilih versi string. Aturan pemilihannya dibahas pada bagian berikut.
Signature dan syarat overloading#
Signature adalah identitas metode yang terdiri atas nama metode, jumlah parameter, tipe setiap parameter, dan urutan parameternya. Dua metode di dalam satu kelas boleh memiliki nama sama sepanjang signature-nya berbeda, sedangkan dua metode dengan signature sama ditolak kompilator. Tipe kembalian bukan bagian signature, sehingga dua metode yang hanya berbeda pada tipe kembaliannya tetap dianggap bentrok.
Kompilator menentukan overloading mana yang dipanggil dengan mencocokkan argumen pemanggil terhadap seluruh signature yang tersedia, proses yang disebut resolusi overloading (overload resolution). Apabila argumen cocok dengan lebih dari satu signature dan tidak ada signature yang unggul, kompilator menolak pemanggilan dengan error CS0121. Contoh berikut menunjukkan dua signature yang berbeda jumlah parameternya.
Console.WriteLine(Pemilih.Tentukan(1));
Console.WriteLine(Pemilih.Tentukan(1, 2));
// Kedua metode memiliki signature berbeda karena jumlah parameternya.
static class Pemilih
{
// Signature metode ini adalah Tentukan(int).
public static string Tentukan(int a) => "versi satu parameter";
// Signature metode ini adalah Tentukan(int, int).
public static string Tentukan(int a, int b) => "versi dua parameter";
}versi satu parameter
versi dua parameterPemanggilan Tentukan(1) cocok persis dengan signature Tentukan(int), sedangkan Tentukan(1, 2) cocok dengan Tentukan(int, int). Kedua metode memakai nama yang sama, tetapi signature yang berbeda membuat keduanya sah dalam satu kelas. Perhatikan bahwa contoh topik ini dideklarasikan di dalam kelas static, karena fungsi lokal pada berkas top-level tidak mendukung overloading.
Argumen opsional#
Parameter yang diberi nilai default menjadi opsional, yaitu pemanggil boleh melewatinya sehingga nilai default yang terpakai. Argumen opsional wajib berada setelah semua parameter wajib, dan nilai defaultnya harus berupa konstanta yang diketahui saat kompilasi, misalnya angka, teks, atau null. Nilai default juga tidak dapat merujuk parameter lain pada daftar yang sama, sehingga setiap default harus berdiri sendiri.
Console.WriteLine(Presenter.Sapa("Budi"));
Console.WriteLine(Presenter.Sapa("Budi", "Selamat pagi"));
// Parameter sapaan memiliki nilai default sehingga boleh tidak diisi.
static class Presenter
{
public static string Sapa(string nama, string sapaan = "Halo")
{
return $"{sapaan}, {nama}!";
}
}Halo, Budi!
Selamat pagi, Budi!Pemanggilan pertama melewatkan parameter sapaan, sehingga nilai default "Halo" yang terpakai. Pemanggilan kedua mengisinya secara eksplisit, sehingga nilai default tidak dipakai. Fasilitas ini mengurangi kebutuhan membuat banyak overloading untuk kasus yang hanya berbeda satu atau dua parameter.
Argumen bernama#
Argumen bernama (named argument) menyebut nama parameternya secara eksplisit dengan bentuk nama: nilai, sehingga makna setiap nilai terbaca jelas dan urutan penulisannya bebas setelah argumen posisional. Argumen bernama juga memungkinkan parameter opsional di tengah daftar diisi tanpa mengetik ulang nilai default parameter yang mendahuluinya.
Console.WriteLine(Presenter.Undang("Citra", acara: "rapat piket"));
// Argumen acara menyebut parameternya secara eksplisit.
static class Presenter
{
public static string Undang(string nama, string tempat = "aula", string acara = "rapat")
{
return $"{nama} diundang ke {acara} di {tempat}.";
}
}Citra diundang ke rapat piket di aula.Pemanggilan Undang("Citra", acara: "rapat piket") mengisi parameter acara di tengah daftar tanpa mengetik ulang nilai default tempat. Nama yang disebut harus benar-benar ada pada deklarasi metode, dan argumen bernama diletakkan setelah argumen posisional. Argumen bernama juga sah untuk parameter wajib, bukan hanya parameter opsional, sehingga pemanggilan dengan banyak parameter tetap terbaca maknanya tanpa membuka deklarasinya.
Parameter params#
Kata kunci params menandai satu parameter array yang menerima sejumlah argumen berubah-ubah, sehingga pemanggil menulis nilainya satu per satu tanpa menyusun array secara manual. Parameter params wajib berada di posisi terakhir, dan di dalam metode parameter itu diperlakukan sebagai array biasa.
Console.WriteLine(Penghitung.Jumlahkan(1, 2));
Console.WriteLine(Penghitung.Jumlahkan(1, 2, 3, 4, 5));
Console.WriteLine(Penghitung.Jumlahkan());
// params mengubah seluruh argumen menjadi satu array int.
static class Penghitung
{
public static int Jumlahkan(params int[] angka)
{
int total = 0;
foreach (int n in angka)
{
total += n;
}
return total;
}
}3
15
0Pemanggilan tanpa argumen pun sah dan menghasilkan array kosong, sehingga metode Jumlahkan mengembalikan 0. Karena params menerima jumlah argumen berapa pun, fasilitas ini sering menggantikan rangkaian overloading yang hanya berbeda jumlah parameternya. Parameter params juga boleh bergandengan dengan parameter wajib di depannya, misalnya Laporan(string judul, params string[] baris), selama posisi terakhir tetap milik params.
Kesalahan umum#
Kesalahan pada topik ini umumnya berupa aturan signature yang dilanggar atau fasilitas yang saling bertumpuk.
- Overloading pada fungsi lokal tidak didukung. Dua fungsi lokal bernama sama ditolak dengan error CS0128 meskipun parameternya berbeda, sehingga contoh overloading pada modul ini selalu dideklarasikan di dalam kelas.
- Dua metode yang hanya berbeda tipe kembaliannya ditolak dengan error CS0111, karena tipe kembalian bukan bagian signature.
- Parameter
paramsyang tidak berada di posisi terakhir ditolak dengan error CS0231, sehingga letakkan selalu setelah parameter lain. - Panggilan ambigu muncul apabila tidak ada signature yang unggul, dengan error CS0121, dan perbaikannya adalah menyederhanakan overloading atau menambah argumen bernama agar pilihan kompilator menjadi jelas.
Ringkasan#
- Signature terdiri atas nama, jumlah, tipe, dan urutan parameter, sedangkan tipe kembalian bukan bagiannya.
- Kompilator memilih overloading dengan mencocokkan argumen pemanggil terhadap signature yang tersedia.
- Nilai default membuat parameter opsional, argumen bernama memperjelas pemanggilan dan mengisi parameter tengah, sedangkan
paramsmenerima jumlah argumen yang berubah-ubah.
Referensi#
- Named and Optional Arguments — Microsoft Learn — Panduan resmi argumen bernama, argumen opsional, dan aturan posisinya.
- Method parameters and modifiers — Microsoft Learn
— Referensi parameter metode, termasuk perilaku parameter
params. - Overview of methods — Microsoft Learn — Gambaran umum deklarasi dan pemanggilan metode C#.