Ao programar eventos em C #, é recomendável criar um delegado na forma de:
delegate XEventHandler(object sender, XEventArgs e);
Minha pergunta está no primeiro argumento do delegado object sender
,. Sempre tem que ser genérico object
? Ter um remetente do tipo object
sempre resulta em código semelhante a este.
val = ((ConcreteType)sender).Property;
ou, ainda mais detalhado,
ConcreteType obj = sender as ConcreteType
if (obj != null) { ... }
Um argumento contra remetentes fortemente tipados é que outros objetos podem encaminhar o evento sem se preocupar com o tipo. Embora isso possa fazer sentido em ambientes de GUI, não tenho certeza se isso pode se beneficiar fora de uma GUI.
E se a classe do remetente for sempre conhecida (pelo menos como uma classe abstrata)? Por exemplo, se estou implementando um ListChanged
evento em uma List
classe abstrata , e se outras classes vão herdá-lo (por exemplo LinkedList
, ArrayList
), está certo definir meu delegado com um remetente do tipo List
?
delegate ListChangedEventHander(List sender, ListChangedEventArgs e);
Ou haveria uma desvantagem em mudar o convencional object sender
para um tipo mais específico?
System.Windows.Forms
espaço para nome é o local onde os eventos são mais usados e fazia sentido assinar oClick
evento deButton
ou aCheckBox
. Assim, o remetente precisa ser genérico. ...List
s.O motivo da recomendação é que ela permite alterações futuras que não necessariamente exigem alterações no código existente e, especialmente, na interface pública.
O próprio mecanismo de evento ainda pode ser usado para eventos no estilo "VB6", mas você precisará alterar todos os consumidores existentes se precisar alterar a assinatura (ou pior: criar novas versões dos mesmos eventos). Com a abordagem recomendada, desde que os itens mais recentes sejam herdados dos existentes, é possível atualizar a assinatura sem corrigir o código existente.
fonte