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

V{ oid FireConnectEvent (object sender, SourceEventArgs e)

for (int k=0; k<e.s.Length; k++)

switch (e.s [k])

{

case"Russia": // строка Russia данных события

Console.WriteLine ("Russia - Россия");

break;

case"Greece": // строка Greece данных события

Console.WriteLine ("Greece - Греция");

break;

default: // строка данных события,

// не совпадающая со строками Russia и Greece

Console.WriteLine ("Don't know - Не знаю");

break;

>

>

class Test

{

static void Main ( )

{

Source sSour= new Source ( ); // Создать источник

Slnk sSink = new Slnk (sSour); // Создать приёмник

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

string [ ] st={"Russia", "Greece", "Russia", "France">;

sSour.RreSourceEvent (st);

>

>

Л

Result:

Russia - Россия

Greece - Греция

Russia - Россия

Don't know - Не знаю

* /

В начале примера 8.3.5 описан простой класс SourceEventArgs данных

события evSource объекта типа Source. Класс SourceEventArgs включает

только открытые для чтения данные- массив s строк типа string , да конст-

руктор, инициирующий этот массив. Как видим, основное назначение этого

класса - создать объект данных с массивом строк. Затем этот объект будет

связан с событием. Заметим, что массив имеет доступ public, чтобы можно

было его извлечь из объекта данных в обработчике. Ведь массив - это то,

что событие "отправляет" объекту, подписавшемуся на это событие. В соот-

ветствии с вышеизложенными правилами наш класс SourceEventArgs насле-

дует класс EventArgs.

После класса данных события помещён класс Source источника собы-

тия. Следует обратить внимание на функцию FireSourceEvent() активизации

события. Перед генерированием события создаётся объект события типа

SourceEventArgs и затем при вызове события в качестве первого аргумента

указывается ссылка this на сам объект-источник события, а в качестве второ-

го аргументы - ссылка на только что созданный объект данных типа

SourceEventArgs.

Класс Sink объекта-подписчика имеет конструктор, который осущест-

вляет подписку на событие evSource объекта-издателя типа Source, ссылка

source на который передана как параметр конструктора.

Класс Sink также содержит обработчик FireConnectEvent(), который,

воспользовавшись ссылкой e второго параметра на объект данных события,

просматривает строки переданного массива s и выдаёт на консоль сообще-

ния. Как уже говорилось в разделе, посвящённом массивам, каждый управ-

ляемый массив наследует класс Array, содержащий свойство Length. Свойст-

во Length здесь используется в условии окончания просмотра массива.

В функции Main() создаются объекты источника и приёмника событий.

Приёмник подписывается на событие источника. Обратите внимание, что

подписка осуществляется конструктором при создании приёмника. Затем со-

бьггие генерируется при вызове интерфейсной функции FireSource() источ-

ника.

Для упрощения применения изложенных выше рекомендаций при использо-

вании событий библиотека .NET Framework содержит описание делегата

EventHandler событий:

C#.

[Serlallzable]

public delegate void EventHandler(object sender, EventArgs e);

C++/CLI.

[Serializable]

public: delegate void EventHandler(object ^sender, EventArgs Ae);

Этот делегат можно применять со всеми событиями. Но поскольку второй

параметр является ссылкой на базовый класс EventArgs, который должен

быть наследован каждым классом данных события, то в обработчике события

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

ный класс данных. Затем этой ссылке надо присвоить ссылку e, сделав при

этом преобразование типов. Пример 8.3.6, являющийся модификацией при-

мера8.3.5, иллюстрируетсказанное.

Пример 8.3.6. Событие типа EventHandler.

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

/ / c #

using System;

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

public class SourceEventArgs: EventArgs

{

public readonly string [ ] s;

public SourceEventArgs (string [ ] s)

{

this.s= s;

>

>

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

public class Source

{

public event EventHandler evSource;

public void FireSourceEvent (string [ ] s)

SourceEventArgs sourceArgs = new SourceEventArgs (s);

evSource (this, sourceArgs);

>

>

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

class Sink

{

public Sink (Source source)

{

source.evSource += new EventHandler

(this.FireConnectEvent);

>