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?