#c# #events
#c# #Мероприятия
Вопрос:
На моем последнем собеседовании при приеме на работу меня спросили, как реализовать класс, который предоставляет событие и уведомляет новых подписчиков события в тот момент, когда они подписываются на это событие.
Другими словами, класс предоставляет событие для информирования подписчиков об обновлении источника данных; многие другие классы могут подписаться на событие в любой момент времени. Когда класс подписывается на событие, он должен быть уведомлен, чтобы получить последнюю версию данных, сохраненных в источнике данных, но другие классы не должны получать уведомления (они уже обновлены).
Они предложили мне переопределить метод AddHandler, но как мне уведомить только нового подписчика?
Есть ли функция .net, о которой я не знаю, или мне нужно определить метод в классе subscriber, который будет вызываться при добавлении в обработчик (какой-то шаблон наблюдателя)?
РЕДАКТИРОВАТЬ: я думаю, что я не совсем ясно выразился, поэтому я попытаюсь объяснить это по-другому. Предположим, у меня есть шаблон наблюдателя. Когда новый наблюдатель подписывается на subject, он немедленно обновляется с последними значениями источника данных по subject.Позже, когда что-то внутри источника данных изменится, субъект уведомит всех зарегистрированных наблюдателей, как обычно. Меня спросили, как это сделать с помощью событий .net
Ответ №1:
Ваша терминология запутанна — что вы подразумеваете под «оно должно быть активировано»? Вы имеете в виду, что обработчик события должен быть вызван один раз в момент подписки? Если это так, это звучит примерно так:
private EventHandler foo;
public event EventHandler Foo
{
add
{
if (value != null)
{
value(this, EventArgs.Empty);
}
foo = value;
}
remove
{
foo -= value;
}
}
Хотя это довольно странный дизайн.
Если это не то, что вам нужно, пожалуйста, попробуйте уточнить.
Смотрите мою статью о событиях и делегатах для получения дополнительной информации.
Комментарии:
1. Не возникает ли ситуации, когда подписчик добавляет к событию, которое им немедленно нужно предоставить с последним значением. В этом случае этот шаблон не может быть полезен.
2. В моем понимании, они хотели знать, как уведомить только последнего подписчика события, я предложил вызывать событие при любой новой подписке, они ответили, что таким образом я бы уведомил всех подписчиков (и простите мой плохой английский, я заменил «активирован» на «уведомлен»)
3. @Stefano: на самом деле нет. Это вызовет его только для нового делегата, который хранится в value. Я бы также задался вопросом, хороший ли это дизайн. На самом деле я не ожидаю, что событие будет вызвано до того, как завершится подписание. Было бы лучше позволить клиенту извлекать новую информацию, когда это необходимо, прежде чем он начнет прослушивать события.