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?