Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Медведев_С++_CLI_C#_Java_J#.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
5.17 Mб
Скачать

Vold имя-функции-активизации()

{

if(дескритор-события != nullptr)

дескриптор-события (список-аргументов);

}

Здесь выполняется объект события, на который указывает дескриптор-события. Функции-обработчики подписываются на это событие посредством накопления их указателей с помощью объектов делегата события и оператора "+=" применительно к объекту события.

Обработчик события может быть описан как обычная или как статическая функция класса объекта приёмника события.

Как свершить (сгенерировать) событие? Это делается просто - создаётся объект источника события и вызывается его открытая функция активизации события с необходимыми аргументами. Разумеется, до этого необходимо создать объекты-приёмники и связать (подписать) событие объекта источника с функциями-обработчиками приёмников.

Пример 8.3.2 иллюстрирует сказанное.

Пример 8.3.2. Использование события.

////////////////////

// C++/CLI

#include "stdafx.h"

using namespace System;

//// не компилируется

delegate void delEv (); // Делегат события

ref class GenEv // Класс объекта-источника события

{

public:

event delEv ^pEv; //Дескриптор события

Void GenerateEv() // Функция-генератор события

{

if(pEv != nullptr) pEv(); // Генерировать событие!

}

};

ref class UseEv // Класс объекта-приёмника события

{

public:

static void HandlerEv() // Функция-обработчик события

{

Console::WriteLine("Объект класса UseEv получил событие");

}

};

Void main()

{

GenEv ^pGenEv= gcnew GenEv; // Создать объект-источник события

UseEv ^pUseEv= gcnew UseEv; // Создать объект-приёмник события

pGenEv -> pEv += gcnew delEv (UseEv::HandlerEv); /* Добавить

обработчик события */

pGenEv -> GenerateEv(); // Сгенерировать событие

}

////////////////////

// C#

using System;

delegate void delEv(); // Делегат события

class GenEv // Класс объекта-источника события

{

public event delEv genEv; // Ссылка на событие

public void GenerateEv() // Функция- генератор события

{

if (genEv != null) genEv();/* Событие с функциями-обработчиками?

Генерировать событие*/

}

}

class UseEv // Класс объекта-приёмника события

{

public void HandlerEv() // Функция-обработчик

{

Console.WriteLine ("Объект класса UseEv получил событие");

}

}

class TestEv

{

static void Main(string[] args)

{

GenEv gEv = new GenEv(); // Создать объект-источник события

UseEv uEv = new UseEv(); // Создать объект-приёмник события

gEv.genEv += new delEv(uEv.HandlerEv); // Добавить обработчик

gEv.GenerateEv(); // Сгенерировать событие

Console.ReadKey();

}

}

Результат:

Объект класса UseEv получил событие

////////////////////

//Java и J#

class GenEv // Класс объекта-источника события

{

UseEv uE; // Ссылка на объект-приёмник

public GenEv (UseEv UE)

{

uE= UE; || Инициализировать ссылку

}

public void GenerateEv ( ) // Функция- генератор события

<

uE.HandlerEv(); || Выполнить обработчик

>

>

class UseEv // Класс объекта-приёмника события

{

<pub lic void HandlerEv ( ) // Функция-обработчик

System.out.println ("Object of the UseEv type received the message");

>

>

class TestEv

{

public static void main(String[] args)

{

UseEv uEv= new UseEv ( ); // Создать объект-приёмник события

GenEv gEv= new GenEv (uEv); // Создать объект-источник события

gEv.GenerateEv (); // Сгенерировать событие

>

>

I*

Result:

Object of the UseEv type received the message

*/

Можно отправить одно событие сразу нескольким объектам-

приёмникам, указав при этом нужные значения аргументов для функций-

обработчиков. Такое событие называется широковещательным и иллюстри-

руется в программе примера 8.3.3.

Пример 8.3.3. Широковещательное событие.

////////////////////

// C++/CLI

#include "stdafx.h"

using namespace System;

delegate vold delEv (String^); // Делегат события

ref class GenEv // Класс объекта-источника события

{

public:

event delEv ^pEv; // Дескриптор события