Lors de la programmation d'événements en C #, il est conseillé de créer un délégué sous forme de:
delegate XEventHandler(object sender, XEventArgs e);
Ma question porte sur le premier argument du délégué, object sender
. Doit-il toujours être générique object
? Avoir un expéditeur de type object
entraîne toujours un code similaire à celui-ci.
val = ((ConcreteType)sender).Property;
ou, encore plus verbeux,
ConcreteType obj = sender as ConcreteType
if (obj != null) { ... }
Un argument contre les expéditeurs fortement typés est que d'autres objets peuvent transmettre l'événement sans se soucier du type. Bien que cela puisse avoir un sens dans les environnements GUI, je ne suis pas sûr que cela puisse bénéficier en dehors d'une interface graphique.
Que faire si la classe de l'expéditeur est toujours connue (au moins en tant que classe abstraite)? Par exemple, si j'implémente un ListChanged
événement dans une List
classe abstraite , et si d'autres classes vont en hériter (par exemple LinkedList
, ArrayList
), est-il correct de définir mon délégué avec un expéditeur de type List
?
delegate ListChangedEventHander(List sender, ListChangedEventArgs e);
Ou y aurait-il un inconvénient à changer le conventionnel object sender
en un type plus spécifique?