// Этап 4. Определение метода, преобразующего входную // информацию в желаемое событие public void SimulateNewMail(String from, String to, String subject) { // Создать объект для хранения информации, которую // нужно передать получателям уведомления NewMailEventArgs e = new NewMailEventArgs(from, to, subject); // Вызвать виртуальный метод, уведомляющий объект о событии // Если ни один из производных типов не переопределяет этот метод, // объект уведомит всех зарегистрированных получателей уведомления OnNewMail(e); }
// MailManager вызывает этот метод для уведомления // объекта Fax о прибытии нового почтового сообщения void FaxMsg(object sender, NewMailEventArgs e) { // 'sender' используется для взаимодействия с объектом MailManager, // если потребуется передать ему какую-то информацию // 'e' определяет дополнительную информацию о событии, // которую пожелает предоставить MailManager // Обычно расположенный здесь код отправляет сообщение по факсу // Тестовая реализация выводит информацию на консоль Console.WriteLine("Faxing mail message:"); Console.WriteLine(" From={0}, To={1}, Subject={2}", e.From, e.To, e.Subject); }
// Этап 3. Определение метода, ответственного за уведомление // зарегистрированных объектов о событии // Если этот класс изолированный, нужно сделать метод закрытым // или невиртуальным protected virtual void OnNewMail(NewMailEventArgs e) { // Сохранить ссылку на делегата во временной переменной // для обеспечения безопасности потоков EventHandler <NewMailEventArgs> temp = Volatile.Read(ref NewMail); // Если есть объекты, зарегистрированные для получения // уведомления о событии, уведомляем их if (temp != null) { temp(this, e); } }