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

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

{

//if (pEv != NULL) // Событие с обработчиками ?

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

>;

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

{

String ^name; // Название объекта

public:

UseEv (String ^nameV ) {name= nameV;}

void HandlerEv (String ^st) // Обработчик события

{

Console::Write ("Объект {0> ", name);

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

Console::WriteLine (st); >

>;

Void main ( )

{

GenEv ^pGenEv= gcnew GenEv;

UseEv ^pUseEvl= gcnew UseEv ("first");

pGenEv -> pEv += gcnew delEv (pUseEvl, &UseEv::HandlerEv);

pGenEv -> GenerateEv ("one" );

UseEv ^pUseEv2= gcnew UseEv ("second");

pGenEv -> pEv += gcnew delEv (pUseEv2, &UseEv::HandlerEv);

pGenEv -> GenerateEv ("two");

pGenEv -> pEv -= gcnew delEv (pUseEv2, &UseEv::HandlerEv);

pGenEv -> GenerateEv ("three" );

/>*

Result:

06BeKTfirst клaccaUseEvпoлyчилcoбытиe one

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

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

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

*/

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

// C#

using System;

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

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

{

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

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

{

if (genEv != null) // Событие с обработчиками ?

genEv (str); // Да I Генерировать событие !

>

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

{

string name; // Название объекта

public UseEv (string nameV ) {name= nameV;}

public void HandlerEv (string st) // Обработчик события

{

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

событие " + st);

>

>

class TestEv

{

static void Main ( )

{

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

UseEv uEvl= new UseEv ("flrst"); // Создать объект-приёмник

gEv.genEv += new delEv (uEvl.HandlerEv); // Подписать на событие

gEv.GenerateEv ("one"); // Генерировать событие

UseEv uEv2= new UseEv ("second"); // Создать объект-приёмник

gEv.genEv += new delEv (uEv2.HandlerEv); // Подписать на событие

gEv.GenerateEv ("two"); // Генерировать событие

gEv.genEv -= new delEv (uEv2.HandlerEv); // Отказать

gEv.GenerateEv ("three"); // Генерировать событие

>

>

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

//Java и J++

Interface iEv

{

public vold HandlerEv

>

class GenEv

<

IEv iE;

public GenEv (IEv IE)

{

iE= IE;

>

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

{

IE,HandlerEv (); // Выполнить обработчик

>

>

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

// Интерфейс с обработчиком

О;

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

// Интерфейсная ссылка

П Инициализировать ссылку на объект

private int num=O;

public UseEvl (int Num){num= Num;}

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

{

System.out.println ("Object" + num +

" ofthe UseEv type received the message");

>

>

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

{

private int num=O;

public UseEv2 (int Num){num= Num;>

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

System.out.println ("Object" + num + " of the UseEv type received

the message");

}

>

class TestEv

{

public static vold main ( )

{

UseEvl uEvl= new UseEvl (1);

UseEv2 uEv2= new UseEv2 (2);

GenEv gEvl= new GenEv (uEvl);

gEvl.GenerateEv ( );

GenEv gEv2= new GenEv (uEv2);

gEv2.GenerateEv ();

>

/>*

Result:

Object 1 of the UseEvl type received the message

Object 2 of the UseEv2 type received the message

* /

Java. Заметим, что в классе источника Java программы применена интер-

фейсная ссылка iE. Чтобы развязать источник события от классов приёмни-

ков, использован интерфейс IEv , включающий обработчик HandlcrEv(). В

Java программе класс каждого приёмника наследует этот интерфейс IEv, обя-

зывающий реализовать HandlerEv(). Теперь, воспользовавшись интерфейс-

ной ссылкой iE (ссылкой на интерфейс IEv), источник, выполняя функцию

GenerateEv(), вызывает (делегирует) функцию этого интерфейса (обработ-

чик), не оперируя с именем класса. Источник может воспользоваться объек-

том приёмника любого класса;, воспользовавшись единственной интерфейс-

// Создать приёмник события

// Создать приёмник события

// Создать источник события

// Сгенерировать событие

// Создать источник события

// Сгенерировать событие

ной ссылкой. Приёмники наследуют интерфейс IEv, поэтому источник, вос-

пользовавшись интерфейсной ссылкой, может вызвать обработчик приём-

ника любого класса, лишь бы этот класс наследовал данный интерфейс.

Рассмотрим более сложную передачу события. Получив событие от объ-

екта-источника, объект-приёмник, так может случиться, теперь уже передаёт

своё событие другому объекту-приёмнику и так далее. В этом случае объект-

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

для другого объекта, взяв на себя функции и объекта-источника, как показа-

но в программе примера 8.3.4.

Пример 8.3.4. Связь между объектами посредством событий.

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

// C++/CLI

#include "stdafx.h"

using namespace System;

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

ref class А // Класс объекта-исгочника и объекта-приёмника

{

public:

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