Menu
CoddyTech

Delegate dan Event

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C# di Coddy. Pelajaran 43 dari 70.

delegate adalah tipe yang merepresentasikan referensi ke sebuah method. Anggaplah sebagai variabel yang menyimpan method, bukan data. Ini memungkinkan kamu untuk meneruskan method sebagai argumen, menyimpannya dalam koleksi, dan memanggilnya secara dinamis.

Kamu mendeklarasikan delegate dengan menentukan tanda tangan method yang dapat dirujuknya:

public delegate void Notify(string message);

public class Publisher
{
    public void SendAlert(string msg) => Console.WriteLine("Alert: " + msg);
}

// Penggunaan
Notify notifier = new Publisher().SendAlert;
notifier("System started");  // Alert: System started

Event dibangun berdasarkan delegate untuk menerapkan pola publish-subscribe. Sebuah class memicu event, dan class lain dapat berlangganan untuk menerima notifikasi. Kata kunci event membatasi cara delegate dapat digunakan: pelanggan hanya dapat menambahkan atau menghapus handler, bukan memicu event secara langsung.

public class Button
{
    public event Action Clicked;
    
    public void Click()
    {
        Clicked?.Invoke();  // Beri tahu semua pelanggan
    }
}

// Berlangganan
Button btn = new Button();
btn.Clicked += () => Console.WriteLine("Button was clicked!");
btn.Click();  // Tombol telah diklik!

Operator += berlangganan pada handler, sedangkan -= membatalkan langganan. Pola ?.Invoke() memanggil event dengan aman hanya jika ada yang berlangganan. Event merupakan bagian mendasar dari aplikasi GUI, game engine, dan sistem apa pun yang objeknya perlu bereaksi terhadap perubahan tanpa coupling yang erat.

challenge icon

Tantangan

Mudah

Mari bangun sistem pemantauan suhu yang menggunakan delegate dan event untuk memberi tahu subscriber setiap kali suhu berubah. Ini adalah contoh klasik pola publish-subscribe yang diaktifkan event dengan begitu elegan.

Kamu akan mengatur kodemu dalam dua file:

  • TemperatureMonitor.cs: Buat class TemperatureMonitor di namespace Monitoring yang berperan sebagai publisher. Monitor-mu harus:
    • Memiliki field privat untuk menyimpan suhu saat ini
    • Mendeklarasikan event menggunakan Action<int> bernama TemperatureChanged yang dijalankan setiap kali suhu diperbarui
    • Memiliki property Temperature (int) yang setter-nya memperbarui field privat dan memicu event dengan nilai suhu yang baru
    Ingat untuk menggunakan pola ?.Invoke() agar event hanya dipicu dengan aman ketika ada subscriber.
  • Program.cs: Di file utama, buat TemperatureMonitor dan subscribe dua handler berbeda ke event TemperatureChanged miliknya:
    • Satu handler yang mencetak: Alert: Temperature is now {value} degrees
    • Handler lain yang mencetak: Logged: {value}
    Setelah subscribe kedua handler, atur suhu dua kali menggunakan nilai dari input. Setiap kali kamu mengatur suhu, kedua handler harus merespons.

Kamu akan menerima dua input:

  • Nilai suhu pertama (bilangan bulat)
  • Nilai suhu kedua (bilangan bulat)

Misalnya, jika inputnya 25 dan 30, output-nya adalah:

Alert: Temperature is now 25 degrees
Logged: 25
Alert: Temperature is now 30 degrees
Logged: 30

Perhatikan bahwa mengatur property Temperature secara otomatis memberi tahu semua subscriber. Monitor tidak perlu mengetahui siapa yang mendengarkan. Itulah keunggulan pendekatan berbasis event!

Coba sendiri

using System;
using Monitoring;

class Program
{
    public static void Main(string[] args)
    {
        // Baca input
        int temp1 = Convert.ToInt32(Console.ReadLine());
        int temp2 = Convert.ToInt32(Console.ReadLine());

        // TODO: Buat instance TemperatureMonitor

        // TODO: Daftarkan handler yang mencetak: "Alert: Temperature is now {value} degrees"

        // TODO: Daftarkan handler lain yang mencetak: "Logged: {value}"

        // TODO: Atur suhu ke temp1

        // TODO: Atur suhu ke temp2
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler C# online