C # tahu dua istilah, delegate
dan event
. Mari kita mulai dengan yang pertama.
Melimpahkan
A delegate
adalah referensi ke suatu metode. Sama seperti Anda dapat membuat referensi ke sebuah instance:
MyClass instance = myFactory.GetInstance();
Anda dapat menggunakan delegasi untuk membuat referensi ke metode:
Action myMethod = myFactory.GetInstance;
Sekarang Anda memiliki referensi ini ke suatu metode, Anda dapat memanggil metode tersebut melalui referensi:
MyClass instance = myMethod();
Tetapi mengapa Anda mau? Anda juga bisa myFactory.GetInstance()
langsung menelepon . Dalam hal ini Anda bisa. Namun, ada banyak kasus untuk dipikirkan di mana Anda tidak ingin seluruh aplikasi memiliki pengetahuan myFactory
atau panggilanmyFactory.GetInstance()
langsung.
Salah satu yang jelas adalah jika Anda ingin dapat menggantikan myFactory.GetInstance()
menjadi myOfflineFakeFactory.GetInstance()
dari satu tempat pusat (alias pola metode pabrik ).
Pola metode pabrik
Jadi, jika Anda memiliki TheOtherClass
kelas dan perlu menggunakan myFactory.GetInstance()
, ini adalah bagaimana kode akan terlihat seperti tanpa delegasi (Anda harus memberi TheOtherClass
tahu tentang jenis Anda myFactory
):
TheOtherClass toc;
//...
toc.SetFactory(myFactory);
class TheOtherClass
{
public void SetFactory(MyFactory factory)
{
// set here
}
}
Jika Anda akan menggunakan delegasi, Anda tidak perlu mengekspos jenis pabrik saya:
TheOtherClass toc;
//...
Action factoryMethod = myFactory.GetInstance;
toc.SetFactoryMethod(factoryMethod);
class TheOtherClass
{
public void SetFactoryMethod(Action factoryMethod)
{
// set here
}
}
Dengan demikian, Anda dapat memberikan delegasi ke beberapa kelas lain untuk digunakan, tanpa memaparkan tipe Anda kepada mereka. Satu-satunya hal yang Anda perlihatkan adalah tanda tangan dari metode Anda (berapa banyak parameter yang Anda miliki dan semacamnya).
"Tanda tangan metode saya", di mana saya mendengar itu sebelumnya? O ya, antarmuka !!! antarmuka menggambarkan tanda tangan seluruh kelas. Pikirkan delegasi sebagai menggambarkan tanda tangan hanya satu metode!
Perbedaan besar lainnya antara antarmuka dan delegasi adalah bahwa ketika Anda menulis kelas Anda, Anda tidak perlu mengatakan kepada C # "metode ini mengimplementasikan tipe delegasi itu". Dengan antarmuka, Anda perlu mengatakan "kelas ini mengimplementasikan jenis antarmuka".
Selanjutnya, referensi delegasi dapat (dengan beberapa batasan, lihat di bawah) referensi beberapa metode (dipanggil MulticastDelegate
). Ini berarti bahwa ketika Anda memanggil delegasi, beberapa metode yang dilampirkan secara eksplisit akan dieksekusi. Referensi objek selalu hanya bisa merujuk ke satu objek.
Batasan untuk a MulticastDelegate
adalah bahwa tanda tangan (metode / delegasi) tidak boleh memiliki nilai pengembalian ( void
) dan kata kunci out
dan ref
tidak digunakan dalam tanda tangan. Jelas, Anda tidak dapat memanggil dua metode yang mengembalikan nomor dan mengharapkan mereka untuk mengembalikan nomor yang sama. Setelah tanda tangan dipatuhi, delegasi secara otomatis a MulticastDelegate
.
Peristiwa
Acara hanyalah properti (seperti get; set; properti ke instance field) yang mengekspos berlangganan ke delegasi dari objek lain. Namun, properti ini tidak mendukung get; set ;. Sebaliknya, mereka mendukung add; menghapus;
Jadi, Anda dapat memiliki:
Action myField;
public event Action MyProperty
{
add { myField += value; }
remove { myField -= value; }
}
Penggunaan di UI (WinForms, WPF, UWP, dan sebagainya)
Jadi, sekarang kita tahu bahwa seorang delegasi adalah referensi ke suatu metode dan bahwa kita dapat memiliki acara untuk memberi tahu dunia bahwa mereka dapat memberi kita metode mereka untuk dirujuk dari delegasi kita, dan kita adalah tombol UI, lalu: kita dapat bertanya kepada siapa saja yang tertarik apakah saya diklik, untuk mendaftarkan metode mereka kepada kami (melalui acara yang kami paparkan). Kita dapat menggunakan semua metode yang diberikan kepada kita dan merujuknya oleh delegasi kita. Dan kemudian, kita akan menunggu dan menunggu .... sampai seorang pengguna datang dan mengklik tombol itu, maka kita akan memiliki cukup alasan untuk memohon delegasi. Dan karena delegasi merujuk semua metode yang diberikan kepada kami, semua metode itu akan dipanggil. Kami tidak tahu apa yang dilakukan metode-metode itu, kami juga tidak tahu kelas mana yang mengimplementasikan metode-metode itu. Yang kami pedulikan hanyalah seseorang tertarik pada kami diklik,
Jawa
Bahasa seperti Java tidak memiliki delegasi. Mereka menggunakan antarmuka sebagai gantinya. Cara mereka melakukannya adalah dengan meminta siapa saja yang tertarik pada 'kami diklik', untuk mengimplementasikan antarmuka tertentu (dengan metode tertentu yang dapat kita panggil), lalu berikan kami seluruh contoh yang mengimplementasikan antarmuka. Kami menyimpan daftar semua objek yang mengimplementasikan antarmuka ini dan dapat memanggil 'metode tertentu yang dapat kami panggil' setiap kali kami diklik.