Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
тюмгу / Лекции КБ ИБАС 1 курс 2 семестр / лекция17 Безопасность 2018.pptx
Скачиваний:
16
Добавлен:
08.12.2019
Размер:
138.44 Кб
Скачать

//метод, в котором инициируется событие

public void ActEventMet ()

{

//обработчик вызывается, если делегат, //ассоциированный с событием, не null

if (activate != null)

activate();

}

}

class Test_Event

{

static void handler1()

{

Console.WriteLine ("Произошло событие - обработчик №1");

}

11

static void handler2()

{

Console.WriteLine ("Произошло событие - обработчик №2");

}

public static void Main ()

{

// создание экземпляра события

MyEvent ev_obj = new MyEvent();

//регистрация - добавление метода к цепочке обработчиков

ev_obj.activate +=

new MyEventHandler (handler1);

//добавление метода к цепочке обработчиков

ev_obj.activate +=

new MyEventHandler (handler2);

// инициирование события

ev_obj.ActEventMet ();

}

}

12

Широковещательные события (ШВС)

Широковещательные, или многоадресные, события могут активизировать несколько обработчиков, определенных для различных объектов.

использование ШВС позволяет различным

объектам реагировать на событие.

Пример 2.

В программном коде представлены два класса.

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

Будут вызываться цепочки методов - обработчиков.

13

using System;

//объявление делегата для определения события

delegate void MyEventHandler ();

//класс, в котором инициируется событие

class MyEvent

{

//объявление события

public event MyEventHandler activate;

//метод, в котором инициируется событие

public void ActEventMet ()

{

if (activate != null)

activate();

}

}

14

class X

{

public void Xhandler()

{

Console.WriteLine("обработка объектом класса Х");

}

}

class Y

{

public void Yhandler()

{

Console.WriteLine("обработка объектом класса Y");

}

}

15

class Test_Event

{

static void handler()

{

Console.WriteLine ("обработка объектом класса Test_Event");

}

public static void Main ()

{

// создание экземпляра класса с событием

MyEvent ev_obj = new MyEvent();

X x_obj = new X();

Y y_obj = new Y();

//регистрация - добавление методов к цепочке обработчиков

ev_obj.activate += new MyEventHandler (handler);

ev_obj.activate += new MyEventHandler (x_obj.Xhandler);

ev_obj.activate += new MyEventHandler (y_obj.Yhandler);

16

// инициирование события

ev_obj.ActEventMet ();

//удаление из цепочки обработчика

ev_obj.activate -= new MyEventHandler (x_obj.Xhandler);

// инициирование события

ev_obj.ActEventMet ();

}

}

17

В примере обработчики определены как методы экземпляра,

сначала в программе обязательно нужно создать объекты,

потом включить в цепочку относящиеся к объектам обработчики.

Соответственно, сгенерированные события передаются отдельно каждому экземпляру, а не классу в целом.

Эту особенность (событие инициирует обработчики всех экземпляров, для которых оно зарегистрировано) иллюстрирует

Пример 3. Реакция на событие обработчиков нескольких объектов.

using System;

//объявление делегата для определения события

delegate void MyEventHandler ();

18

//класс, в котором инициируется событие

class MyEvent

{

public event MyEventHandler activate; //объявление события

//метод, в котором инициируется событие

public void ActEventMet ()

{

if (activate != null)

activate();

}

}

class X

{

int id;

public X (int x) {id = x;}

public void Xhandler()

{

Console.WriteLine("обработка события объектом №" + id);

}

}

19

class Test_Event

{

public static void Main ()

{

// создание экземпляра класса с событием

MyEvent ev_obj = new MyEvent();

X x_obj1 = new X(1);

X x_obj2 = new X(2);

X x_obj3 = new X(3);

//регистрация - добавление методов к цепочке обработчиков

ev_obj.activate += new MyEventHandler (x_obj1.Xhandler);

ev_obj.activate += new MyEventHandler (x_obj2.Xhandler);

ev_obj.activate += new MyEventHandler (x_obj3.Xhandler);

// инициирование события

ev_obj.ActEventMet ();

}

}

20