Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Классы receiver






Построим два класса, объекты которых способны получать и обрабатывать событие Changed, возникающее у объектов класса ListWithChangedEvent. Вначале разберемся с устройством одного из этих классов, названного Receiver1. Вот его код:

class Receiver1 { private ListWithChangedEvent list; /// < summary> /// Конструктор /// Присоединяет обработчик к событию /// < /summary> /// < param name=" list" > объект, посылающий сообщение< /param> public Receiver1(ListWithChangedEvent list) { this.list = list; // Присоединяет обработчик к событию. list.Changed += new ChangedEventHandler(ListChanged); } public void OffConnect() { // Отсоединяет обработчик list.Changed -= new ChangedEventHandler(ListChanged); } }//class Receiver1

Класс Receiver1 является примером класса, чьи объекты настроены на прием сообщения от одного объекта классаListWithChangedEvent. Такой объект передается конструктору класса, который и выполняет всю необходимую работу, присоединяя обработчик события к событию переданного конструктору объекта, так что вызов конструктора класса Receiver1приводит к созданию объекта, способного принимать и обрабатывать сообщения от объекта, задающего список.

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

private void ListChanged(object sender, ChangedEventArgs args) { Console.WriteLine(" Сообщение послал {0}, " + " элемент = {1}. " + " Сообщение получил: Receiver1 - ", args.Name, args.Item); if(args.Permit = (int)args.Item < 10) Console.WriteLine(" Изменения разрешаю"); else Console.WriteLine(" Изменения не разрешаю"); }

С входными аргументами все просто. Они используются для формирования сообщения и формирования принимаемого решения. Но стоит подробнее разобраться, как в данном конкретном случае формируется выходной аргумент. Свое решение " Разрешить или не разрешить изменение" обработчик принимает в зависимости от величины элемента (item). Свое решение обработчик события принимает независимо, без оглядки на методы, совместно с ним обрабатывающими то же событие.

Класс Receiver2 в отличие от класса Receiver1 позволяет слушать и обрабатывать сообщения нескольких объектов классаsender. С конструктора класса снимается задача связывания события с обработчиком события. Ему не нужно теперь передавать объект класса sender. У класса появляется специальный метод OnConnect, которому передается объект класса sender. Присоединение обработчика события к событию объекта sender выполняется при каждом вызове метода OnConnect.

События, приходящие от разных объектов, могут обрабатываться одним обработчиком класса receiver. Возможно существование в классе набора обработчиков событий, чтобы разные объекты могли иметь и разные методы, обрабатывающие приходящее сообщение о возникшем событии. Так строятся инерфейсные классы, где у каждой командной кнопки свой обработчик события. В нашем примере предусмотрен один обработчик для всех объектов одного класса.

class Receiver2 { void ListChanged(object sender, ChangedEventArgs args) { Console.WriteLine(" Сообщение послал {0}, " + " элемент = {1}. " + " Сообщение получил: Receiver2 - ", args.Name, args.Item); if (args.Permit =(int)args.Item < 20) Console.WriteLine(" Изменения разрешаю"); else Console.WriteLine(" Изменения не разрешаю"); } public void OnConnect(ListWithChangedEvent list) { list.Changed += new ChangedEventHandler(ListChanged); //list.Changed = new ChangedEventHandler(ListChanged); } public void OffConnect(ListWithChangedEvent list) { list.Changed -= new ChangedEventHandler(ListChanged); //list.Changed = null; } }//class Receiver2

Классы созданы, теперь осталось создать объекты и заставить их взаимодействовать, чтобы одни создавали события, а другие их обрабатывали. Эту часть работы будет выполнять тестирующая процедура класса Testing:

public void TestChangeList(){ // Создаются два объекта, вырабатывающие события ListWithChangedEvent list1 = new ListWithChangedEvent(" list1"); ListWithChangedEvent list2 = new ListWithChangedEvent(" list2"); // Создаются два объекта классов Receiver1 и Receiver2, //способные обрабатывать события класса ListWithChangedEvent Receiver1 receiver1 = new Receiver1(list1); Receiver2 receiver2 = new Receiver2(); receiver2.OnConnect(list1); receiver2.OnConnect(list2); // Работа с объектами, приводящая к появлению событий Random rnd = new Random(); list1.Add(rnd.Next(20)); list1.Add(rnd.Next(20)); list1.Add(33); list1[1] = 17; list2.Add(10); list2[0] = 25; list2.Clear(); //Отсоединение обработчика событий receiver1.OffConnect(); list1.Add(21); list1.Clear(); }

В тестирующей процедуре моделируется процесс работы с объектами, посылающими сообщения о событиях и принимающими эти сообщения. Два созданных объекта list1 и list2 посылают сообщения о событиях всякий раз, когда в список добавляется новый элемент или изменяется значение существующего элемента. Два созданных объекта receiver1 и receiver2 получают приходящие сообщения. Первый из них получает сообщения только от объекта list1, второй - от двух объектов list1 и list2. В некоторых ситуациях оба получателя сообщений " дают добро" на изменение элемента, в других ситуациях оба запрещают изменения.

В заключение взгляните на результаты работы этой процедуры.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.