287
Разработка.типа,.поддерживающего.событие
рис. 11.1.
.Архитектура.приложения,.в.котором.используются.события
При инициализации приложения создается экземпляр объекта
MailManager
,
поддерживающего событие
NewMail
. Во время создания объекты
Fax
и
Pager
ре-
гистрируются в качестве получателей уведомлений о событии
NewMail
(приход
нового сообщения) объекта
MailManager
, в результате
MailManager
«знает», что
эти объекты следует уведомить о появлении нового сообщения. Если в дальнейшем
MailManager
получит новое сообщение, это приведет к вызову события
NewMail
,
позволяющего всем зарегистрировавшимся объектам выполнить требуемую об-
работку нового сообщения.
разработка типа,
поддерживающего событие
Для создания типа, поддерживающего одно или более событий, разработчик должен
выполнить ряд действий. Все эти действия будут описаны ниже. Наше приложение
MailManager
(его можно загрузить в разделе Books сайта
http://wintellect com
) со-
держит весь необходимый код типов
MailManager
,
Fax
и
Pager
. Как вы заметите,
типы
Fax
и
Pager
практически идентичны.
288
Глава.11 .События
Этап 1. Определение типа для хранения
всей дополнительной информации,
передаваемой получателям
уведомления о событии
При возникновении события объект, в котором оно возникло, должен передать до-
полнительную информацию объектам-получателям уведомления о событии. Для
предоставления получателям эту информацию нужно инкапсулировать в собствен-
ный класс, содержащий набор закрытых полей и набор открытых неизменяемых
(только для чтения) свойств. В соответствии с соглашением, классы, содержащие
информацию о событиях, передаваемую обработчику события, должны наследовать
от типа
System.EventArgs
, а имя типа должно заканчиваться словом
EventArgs
.
В этом примере у типа
NewMailEventArgs
есть поля, идентифицирующие отправи-
теля сообщения (
m_from
), его получателя (
m_to
) и тему (
m_subject
).
// Этап 1. Определение типа для хранения информации,
// которая передается получателям уведомления о событии
internal class NewMailEventArgs : EventArgs {
private readonly String m_from, m_to, m_subject;
public NewMailEventArgs(String from, String to, String subject) {
m_from = from; m_to = to; m_subject = subject;
}
public String From { get { return m_from; } }
public String To { get { return m_to; } }
public String Subject { get { return m_subject; } }
}
ПриМеЧание
Тип.EventArgs.определяется.в.библиотеке.классов. NET.Framework.Class.Library.(FCL).
и.выглядит.примерно.следующим.образом:
[ComVisible(true), Serializable]
public class EventArgs {
public static readonly EventArgs Empty = new EventArgs();
public EventArgs() { }
}
Как.видите,.в.этом.классе.нет.ничего.особенного .Он.просто.служит.базовым.типом,.
от.которого.можно.порождать.другие.типы .С.большинством.событий.не.передается.
дополнительной.информации .Например,.в.случае.уведомления.объектом.Button.
о.щелчке.на.кнопке,.само.обращение.к.методу.обратного.вызова.—.и.есть.вся.нуж-
ная.информация .Определяя.событие,.не.передающее.дополнительные.данные,.
можно.не.создавать.новый.объект.Event-Args,.достаточно.просто.воспользоваться.
свойством.EventArgs Empty
Do'stlaringiz bilan baham: |