При програмуванні подій на C # рекомендується створити делегата у вигляді:
delegate XEventHandler(object sender, XEventArgs e);
Моє питання на перший аргумент делегата object sender. Чи завжди це має бути родовим object? Наявність відправника типу objectзавжди призводить до коду, подібного до цього.
val = ((ConcreteType)sender).Property;
або, ще більш багатослівний,
ConcreteType obj = sender as ConcreteType
if (obj != null) { ... }
Один з аргументів проти сильно набраних відправників - це те, що інші об'єкти можуть пересилати подію, не переживаючи про тип. Хоча це може мати сенс у середовищі графічного інтерфейсу, я не впевнений, чи може це отримати користь поза графічним інтерфейсом.
Що робити, якщо клас відправника завжди відомий (принаймні як абстрактний клас)? Наприклад, якщо я реалізую ListChangedподію в абстрактному Listкласі, і якщо інші класи збираються успадкувати його (наприклад LinkedList, ArrayList), чи все в порядку визначити мого делегата із типом відправника List?
delegate ListChangedEventHander(List sender, ListChangedEventArgs e);
Або, чи не буде змінити звичайний object senderна більш конкретний тип?