СОБЫТИЯ Лекция 1
Взаимодействие объектов 2 Взаимодействие между объектами A и B можно организовать двумя способами. 1.Объект A вызывает метод объекта B. Направление зависимости: 2. Объект B подписывается на событие объекта A. Направление зависимости: Пример: А – кнопка, В – форма в программе. Код кнопки написан задолго до формы, поэтому взаимодействие первого типа исключается. Форма должна подписаться на событие кнопки. AB AB
Событие Событие – это метафора. На самом деле событие – это момент, когда в источнике выполняется определенный участок кода. Чтобы источник мог оповещать о каком-то событии своих подписчиков, он должен: 1.Хранить у себя перечень ссылок на методы подписчиков (делегат) и вызывать их в момент события. 2.Иметь открытое свойство, при помощи которого подписчики регистрируют свои методы (подписываются и отписываются). Все это обеспечивает член класса event – событие. 3
Пример подписки class Publisher { public event EventHandler Step; public void Run() { for (int i = 1; i < 5; i++) { Thread.Sleep(500); if (Step != null) { Step(this, EventArgs.Empty); } class Program { static void Main(string[] args) { X x = new X(); x.Step += x_Step; x.Run(); } static void x_Step(object sender, EventArgs e) { Console.WriteLine("step"); } Класс Publisher периодически издает событие Step, а класс Program слушает это событие. 4 EventHandler – библиотечный делегат. Если событие не стандартное, объявляют пользовательский делегат.
Пример пользовательского события 5 Событие Finish издается, когда спортсмен финиширует. Информация о событии включает: фамилию спортсмена, время прохождения дистанции. public class SportEventArg { public string Name { set; get; } public TimeSpan Time { set; get; } } public delegate void SportEventHandler(object source, SportEventArg e); class Publisher { public event SportEventHandler Finish; public void OnFinish(SportEventArg e) { if (Finish != null) { Finish(this, e); }
Операции подписки и отписки 6 Для событий перегружены операции += и -=, при помощи которых выполняется подписка и отписка. Операция присваивания для событий не определена. Экземпляры делегатов разных типов – синглетоны, что позволяет успешно отписываться. class Program { public static void Main() { Publisher publisher = new Publisher(); publisher.Finish += publisher_Finish; } static void publisher_Finish(object source, SportEventArg e) { }
Самостоятельно 2. Уже объявлен класс Calc, в котором есть методы Plus и Minus. class Calc { protected double Plus(double a, double b) {…} protected double Minus(double a, double b) {…} } Объявлен также тип OpArgs: class OpArgs: EventArgs { public double A, B; } Объявите класс Calc2, который наследует Calc и издает события Plused и Minused каждый раз, когда вызываются методы Plus и Minus (для этого перекройте методы Plus и Minus в производном классе). Тип событий Plused и Minused должен быть EventHandler Объявить делегат, который ссылается на произвольную бинарную операцию над целыми числами, т.е. int Op(int x, int y). Создать объект делегата и вызвать его синхронно и асинхронно.