Глава.11 .События
Далее приведен пример класса, использующего класс
EventSet
. Этот класс
имеет поле, ссылающееся на объект
EventSet
, и каждое событие из этого класса
реализуется явно таким образом, что каждый метод
add
сохраняет заданного де-
легата обратного вызова в объекте
EventSet
, а каждый метод
remove
уничтожает
заданного делегата обратного вызова (если найдет его).
using System;
// Определение типа, унаследованного от EventArgs для этого события
public class FooEventArgs : EventArgs { }
public class TypeWithLotsOfEvents {
// Определение закрытого экземплярного поля, ссылающегося на коллекцию.
// Коллекция управляет множеством пар "Event/Delegate"
// Примечание: Тип EventSet не входит в FCL,
// это мой собственный тип
private readonly EventSet m_eventSet = newEventSet();
// Защищенное свойство позволяет производным типам работать с коллекцией
protected EventSet EventSet { get { return m_eventSet; } }
#region Code to support the Foo event (repeat this pattern for additional events)
// Определение членов, необходимых для события Foo.
// 2a. Создайте статический, доступный только для чтения объект
// для идентификации события.
// Каждый объект имеет свой хеш-код для нахождения связанного списка
// делегатов события в коллекции.
protected static readonly EventKey s_fooEventKey = newEventKey();
// 2b. Определение для события методов доступа для добавления
// или удаления делегата из коллекции.
public event EventHandler Foo {
add { m_eventSet.Add(s_fooEventKey, value); }
remove { m_eventSet.Remove(s_fooEventKey, value); }
}
// 2c. Определение защищенного виртуального метода On для этого события.
protected virtual void OnFoo(FooEventArgs e) {
m_eventSet.Raise(s_fooEventKey, this, e);
}
// 2d. Определение метода, преобразующего входные данные этого события
public void SimulateFoo() {OnFoo(newFooEventArgs());}
#endregion
}
Программный код, использующий тип
TypeWithLotsOfEvents
, не может сказать,
было ли событие реализовано неявно компилятором или явно разработчиком. Он
просто регистрирует события с использованием обычного синтаксиса. Пример
программного кода:
301
Явное.управление.регистрацией.событий
public sealed class Program {
public static void Main() {
TypeWithLotsOfEvents twle = new TypeWithLotsOfEvents();
// Добавление обратного вызова
twle.Foo += HandleFooEvent;
// Проверяем работоспособность
twle.SimulateFoo();
}
private static void HandleFooEvent(object sender, FooEventArgs e) {
Console.WriteLine("Handling Foo Event here...");
}
}
Do'stlaringiz bilan baham: |