Как уведомить событие подписчика - PullRequest
8 голосов
/ 27 мая 2011

В моем последнем собеседовании меня спросили, как реализовать класс, который выставляет событие и уведомляет новых подписчиков события в тот момент, когда они подписываются на это событие.

Другими словами, класс предоставляет событие для информирования подписчиков при обновлении источника данных;Многие другие классы могут подписаться на событие в любой момент времени.Когда класс подписывается на событие, он должен быть уведомлен о получении последней версии данных, сохраненных в источнике данных, но другие классы не должны уведомляться (они уже обновлены).

Они предложили мнепереопределить метод addHandler, но как мне уведомить только нового подписчика?

Есть ли какая-то особенность .net, о которой я не знаю, или мне нужно определить метод в классе подписчика, который будет вызыватьсяпри добавлении в обработчик (какой-то шаблон наблюдателя)?

РЕДАКТИРОВАТЬ: я думаю, что я не был ясен, поэтому я попытаюсь объяснить это по-другому.Предположим, у меня есть образец наблюдателя.Когда новый наблюдатель подписывает тему, он сразу же обновляется самыми последними значениями источника данных по субъекту. Позднее, когда что-то внутри источника данных изменится, субъект уведомит всех зарегистрированных наблюдателей, как обычно.Меня спросили, как сделать это с помощью .net events

1 Ответ

15 голосов
/ 27 мая 2011

Ваша терминология шерстистая - что вы подразумеваете под "она должна быть активирована"?Вы имеете в виду, что обработчик событий должен вызываться один раз в момент подписки?Если это так, то это звучит примерно так:

private EventHandler foo;

public event EventHandler Foo 
{
    add
    {
        if (value != null)
        {
            value(this, EventArgs.Empty);
        }
        foo += value;
    }

    remove
    {
        foo -= value;
    }
}

Это довольно странный дизайн.

Если это не то, что вам нужно, попробуйте уточнить.1007 * См. Мою статью о событиях и делегатах для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...