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?
System.Windows.Forms
espace de noms est l'endroit où les événements sont les plus utilisés, et il était logique de souscrire à l'Click
événement deButton
ou aCheckBox
. L'expéditeur doit donc être générique. ...List
s.La raison de la recommandation est qu'elle permet des modifications futures qui ne nécessitent pas nécessairement des modifications du code existant, et en particulier de l'interface publique.
Le mécanisme d'événement lui-même peut toujours être utilisé pour les événements de style "VB6", mais vous devrez changer tous les consommateurs existants si vous avez besoin de changer la signature (ou pire: créer de nouvelles versions des mêmes événements). Avec l'approche recommandée, tant que les éléments les plus récents héritent des éléments existants, vous pouvez mettre à jour la signature sans corriger le code existant.
la source