При програмуванні подій на 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
на більш конкретний тип?