Saat memprogram acara dalam C #, disarankan untuk membuat delegasi dalam bentuk:
delegate XEventHandler(object sender, XEventArgs e);
Pertanyaan saya ada pada argumen pertama delegasi object sender
,. Apakah harus selalu menjadi generik object
? Memiliki pengirim tipe object
selalu menghasilkan kode yang mirip dengan ini.
val = ((ConcreteType)sender).Property;
atau, bahkan lebih verbose,
ConcreteType obj = sender as ConcreteType
if (obj != null) { ... }
Salah satu argumen yang menentang pengirim yang diketik dengan sangat adalah bahwa objek lain dapat meneruskan acara tanpa khawatir tentang jenisnya. Meskipun ini mungkin masuk akal di lingkungan GUI, saya tidak yakin apakah itu bisa menguntungkan di luar GUI.
Bagaimana jika kelas pengirim selalu dikenal (setidaknya sebagai kelas abstrak)? Misalnya, jika saya mengimplementasikan suatu ListChanged
acara dalam List
kelas abstrak , dan jika kelas lain akan mewarisinya (misalnya LinkedList
, ArrayList
), apakah boleh mendefinisikan delegasi saya dengan pengirim tipe List
?
delegate ListChangedEventHander(List sender, ListChangedEventArgs e);
Atau, akankah ada kerugian dari mengubah yang konvensional object sender
ke jenis yang lebih spesifik?
System.Windows.Forms
namespace adalah tempat di mana peristiwa paling banyak digunakan, dan masuk akal untuk berlanggananClick
acaraButton
atau aCheckBox
. Dengan demikian pengirim perlu menjadi generik. ...List
s.Alasan untuk rekomendasi ini adalah memungkinkan untuk perubahan di masa depan yang tidak memerlukan perubahan pada kode yang ada, dan terutama antarmuka publik.
Mekanisme acara itu sendiri masih dapat digunakan untuk acara-acara "VB6", tetapi Anda harus mengubah semua konsumen yang ada jika Anda perlu mengubah tanda tangan (atau lebih buruk: membuat versi baru dari acara yang sama). Dengan pendekatan yang disarankan, selama item baru mewarisi dari yang sudah ada, Anda dapat memperbarui tanda tangan tanpa memperbaiki kode yang ada.
sumber