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

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

{

Console:.:WriteUne ("Объект класса А послал событие FromA ");

pEvAB ("FromA"); // Сгенерировать событие

}

void HandlerEv (String ^str) // Обработать событие

{

Console::WriteLine ("Объект класса А получил событие {0> ", str);

>

>;

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

{

public:

event delEv ^pEvBC; // Дескриптор pEvBC на событие

vold HandlerEv (String ^str) // Обработать событие

{

Console::WriteLine ("Объект класса В получил событие {0> ", str);

Console::WrlteLlne ("Объект класса В послал событие FromB");

pEvBC ("FromB"); // Сгенерировать событие

>

>;

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

{

public:

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

void HandlerEv (String ^str) // Обработать событие

{

Console::WriteLine ("Объект класса С получил событие {0} ", str);

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

pEvCA ("FromC"); // Сгенерировать событие >

>;

Void main (void)

{

А ^pA= gcnew А; // Создать объект класса А, генерирующий событие pEvAB

В ^pB= gcnew В; // Создать объект класса В, генерирующий событие pEvBC

С ^pC= gcnew С; // Создать объект класса С, генерирующий событие pEvCA

pA -> pEvAB += gcnew delEv (pB, &B::HandlerEv); // Инициализировать pEvAB

pB -> pEvBC += gcnew delEv (pC, &C::HandlerEv); // Инициализировать pEvBC

pC -> pEvCA += gcnew delEv (pA, &A::HandlerEv); // Инициализировать pEvCA

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

>

/ *

Result:

Объект

Объект

Объект

Объект

Объект

Объект

*/

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

/ / C #

using System;

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

{c lass А // Класс объекта, посылающего событие объекту класса В

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

public void GenerateEv ( ) // Сгенерировать событие

{

if (evAB 1= null)

{

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

evAB ("FromA"); // Послать событие

>

>

public void HandlerEv (string st) // Обработать поступившее событие

{

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

> >

класса А послал событие FromA

класса В получил событие FromA

класса В послал событие FromB

класса С получил событие FromB

класса С послал событие FromC

класса А получил событие FromC

c|ass В // Класс объекта, посылающего событие объекту класса С

public event delEv evBC; // Указатель события

public void HandlerEv (string str) // Обработать поступившее событие

{

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

if (evBC 1= null)

{

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

evBC ("FromB"); // Послать событие

>

>

>

class С // Класс объекта, посылающего событие объекту класса А

<

public event delEv evCA; // Указатель события

public void HandierEv (string str) // Обработать поступившее событие

{

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

if (evCA 1= null)

{

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

evCA ("FromC"); // Послать событие

>

>

>

class TestEv

{

static void Main ( )

{

А a= new А ( );

В b= new В ();

С c= new С ( );

a.evAB += new delEv (b.HandlerEv);

b.evBC += new delEv (c.HandlerEv);

c.evCA += new delEv (a.HandlerEv);

a.GenerateEv ( );

>

>

Программа на языке C++/CLI и языке C# содержит класс А, содержа-

щий функцию GenerateEv(), только генерирующую событие evAB, и функ-

цию HandlerEv(), только обрабатывающую поступившее событие.

Другие два класса В и С идентичны и содержат только одну функцию

HandlerEv(), которая не только обрабатывает поступившее событие, но и ге-

нерирует новое событие. Эта функция обеспечивает событийную связь меж-

ду двумя объектами: объект получает событие от одного объекта и после

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

Главная функция Main() или main() вначале создаёт три объекта клас-

сов А, В и С. Затем устанавливается событийная связь между этими объекта-

// Создать объект а класса А

// Создать объект b класса В

|| Создать объект с класса С

// Направить событие отД к В

П Направить событие от В к С

// Направить событие от С к А

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

// объекта-источника а

ми. Посредством делегата delEv на событие объекта класса А подписывает-

ся обработчик HandlerEv() объекта класса В, на событие объекта класса В

подписывается обработчик HandlerEv() объекта класса С и на событие объек-

та класса А подписывается обработчик HandlerEv() объекта класса С. Так

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

объектами. Когда эта связь установлена, выполняется функция GcnerateEv()

первого объекта цепочки. Результат передачи событий между объектами ви-

ден на консоли.

Можно для каждой потенциально возможной ситуации предложить со-

бытие со своим именем. Тогда при решении сложных задач придётся иметь

дело с очень большим числом событий и окажется громоздкой реализация

связи источников с приёмниками.

Для уменьшения числа событий достаточно выделить основные собы-

тия и связать с каждым из них данные, конкретизирующие это событие при-

менительно к конкретным ситуациям. При этом желательно уплотнить пере-

даваемые данные события, поместив их в один объект. Короче говоря, хоро-

шо бы унифицировать событие, сделав связь с ним единообразной и понят-

ной. То есть придерживаться определённых правил при работе с событиями,

которые не только бы упорядочили разработку событий, но и существенно

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

Особенно это важно при использовании общеупотребительных событий, на-

пример, событий интерфейсных элементов типа Button (кнопка), ListBox

(список) и других.

При программировании событий рекомендуется:

- в имени обработчика события использовать слово Handler,

- обработчики событий должны иметь возвращаемое значение void,

- делегат события и, конечно, обработчик должен иметь следующий

список параметров:

(object sender, EventArgs args) // C#

(Object ^sender, EventArgs ^args) // C++/CLI

где sender (^sender) - ссылка (дескриптор) на объект-источник события,

args (^args) - ссылка (дескриптор) на объект класса, порождённого из

класса EventArgs, который содержит открытые (public) данные или свойства,

связанные с событием.

Класс EventArgs наследует класс Object и содержит единственное свой-

ство Empty, значение false которого указывает о наличии данных, а true - об

их отсутствии.

Пример 8.3.5 показывают создание и применение событий с массивом

строк на основе высказанных рекомендаций.

Пример 8.3.5. Событие с данными.

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

/ / C #

using System;

// Класс SourceBventArgs для данных типа string события из класса Source

public class SourceEventArgs: EventArgs

{

public readonly string [ ] s;

public SourceEventArgs (string [ ] s)

{

this.s= s;

>

>

П Класс Source - источник события с объектом типа SourceEventArgs

public class Source

{

public delegate void delEvSourceHandler (object sender,

SourceEventArgs se);

public event delEvSourceHandler evSource;

public vold FireSourceEvent (string [ ] s)

{

SourceEventArgs sourceArgs = new SourceEventArgs (s);

evSource (this, sourceArgs);

>

>

// Класс Sink с обработчиком события объекта source класса Source

class Sink

{

public Sink (Source source)

{

source.evSource += new Source.delEvSourceHandler

(FireConnectEvent);

>