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 startedEvent 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.
Tantangan
MudahMari 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 classTemperatureMonitordi namespaceMonitoringyang berperan sebagai publisher. Monitor-mu harus:- Memiliki field privat untuk menyimpan suhu saat ini
- Mendeklarasikan event menggunakan
Action<int>bernamaTemperatureChangedyang dijalankan setiap kali suhu diperbarui - Memiliki property
Temperature(int) yang setter-nya memperbarui field privat dan memicu event dengan nilai suhu yang baru
?.Invoke()agar event hanya dipicu dengan aman ketika ada subscriber.Program.cs: Di file utama, buatTemperatureMonitordan subscribe dua handler berbeda ke eventTemperatureChangedmiliknya:- Satu handler yang mencetak:
Alert: Temperature is now {value} degrees - Handler lain yang mencetak:
Logged: {value}
- Satu handler yang mencetak:
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: 30Perhatikan 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
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalNamespace & DirektifPengantar class & objectKata Kunci 'this'Method dan ParameterField vs PropertyKonstruktorInisialisasi objectRingkasan: Kalkulator Sederhana4Pewarisan
Sintaks Dasar Pewarisan (:)Kata Kunci 'base'Kata Kunci Virtual & OverrideClass SealedBase Class 'object'Rangkuman: Hierarki Karyawan7Fitur Lanjutan
Overloading OperatorIndexer (this[])Penimpaan ToString()Extension methodRingkasan: Custom list2Property & Anggota Statis
Property yang Diimplementasikan OtomatisProperty Hanya Baca dan Hanya TulisField dan method StatisClass StatisAnggota Berbentuk Ekspresi5Polimorfisme & Antarmuka
Polimorfisme saat kompilasi vs runtimeAntarmuka vs kelas abstrakBeberapa antarmukaAntarmuka eksplisitUpcasting & DowncastingRingkasan, Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi daripada PewarisanGenerics (class dan method)Delegate dan EventAtribut dan ReflectionIDisposable dan Pernyataan usingDasar-Dasar Dependency Injection11Pola Desain Bagian 2
Pola PerintahPola AdapterPola DecoratorPola Template MethodPola StatePola CompositeLatihan sendiri: Compiler C# online