Laporan pembayaran di aplikasi kasir sering membutuhkan dua tampilan: layar kasir cukup menerima ringkasan, sementara layar supervisor membutuhkan detail lengkap. Kita dapat menulis dua method dan memilih salah satunya dengan if-else, tetapi pola itu mengikat pemanggil ke seluruh daftar pilihan. Delegate menawarkan jalan lain: sebuah method dapat disimpan ke dalam variabel, dikirim ke method lain, dan dipanggil lewat nama variabel tersebut.

Delegate sebagai Tipe untuk Method #

Delegate adalah tipe yang mendeskripsikan bentuk method: daftar parameter dan return type. Saat compiler membaca deklarasi delegate void LaporanHandler(string pesan), compiler menghasilkan class turunan MulticastDelegate yang dapat menunjuk method mana pun dengan signature yang cocok. Instance delegate kemudian dipakai layaknya method biasa.

Perlu digarisbawahi bahwa LaporanHandler adalah tipe, bukan method. Sebagaimana int mendeskripsikan angka, LaporanHandler mendeskripsikan bentuk method: satu parameter string dan tanpa return. Konsekuensinya, pemanggil tidak perlu tahu nama method target; pemanggil cukup memanggil variabel delegate, dan target method dapat berganti kapan pun tanpa mengubah kode pemanggil.

csharp
delegate void LaporanHandler(string pesan);

static void TampilRingkas(string pesan) =>
    Console.WriteLine($"[RINGKAS] {pesan}");

static void TampilDetail(string pesan) =>
    Console.WriteLine($"[DETAIL] Pesanan: {pesan}");

LaporanHandler laporan = TampilRingkas;
laporan("INV-101 selesai dibayar");

laporan = TampilDetail;
laporan("INV-101 selesai dibayar");

Output yang Dihasilkan:

text
[RINGKAS] INV-101 selesai dibayar
[DETAIL] Pesanan: INV-101 selesai dibayar

Bedah Kode Baris per Baris #

Mari kita telaah kode di atas:

  1. Baris 1: Keyword delegate mendeklarasikan tipe LaporanHandler dengan satu parameter string dan return void. Nama tipe bebas dipilih; yang penting adalah bentuknya.
  2. Baris 3-7: Method TampilRingkas dan TampilDetail cocok dengan signature LaporanHandler. Nama method seperti ini disebut method group.
  3. Baris 9: Penugasan laporan = TampilRingkas membuat instance delegate yang menunjuk method tersebut; compiler melakukan konversi method group secara otomatis.
  4. Baris 10: Pemanggilan laporan(...) meneruskan argumen ke method target, sehingga baris [RINGKAS] tercetak.
  5. Baris 12-13: Penugasan baru mengganti target. Variabel laporan kini menunjuk TampilDetail, bukan menumpuk kedua method dalam satu daftar.

Satu perbedaan kecil yang sering tertukar: penugasan = mengganti isi variabel delegate, sedangkan += pada bab Multicast Delegate menambahkan target ke daftar pemanggilan. Pada bab ini kita sengaja memakai = agar perilaku ganti target terlihat jelas dari dua baris output yang berbeda gaya.