Мегаобучалка Главная | О нас | Обратная связь


Контроль над событиями



2016-01-26 343 Обсуждений (0)
Контроль над событиями 0.00 из 5.00 0 оценок




При разборе первого примера подраздела говорилось, что введение дополнительных функций позволяет контролировать работу с событием. Но как оказалось, события .NET полностью закрыты для программиста. Они скрывают всю грязную работу за кулисами и контролировать обращение к событиям не представляется возможным. Но это утверждение верно только при стандартном способе использования событий. Также существует дополнительный расширенный режим их использования, при котором программист может самостоятельно объявить функции, управляющие подключением и отключением делегатов-обработчиков. Для этого в языке C# предусмотрена специальная конструкция, с использованием двух дополнительных ключевых слов add и remove.

event DelegateName SomeEvent { add { // Код, реализующий добавление делегата к списку // вызова события. } remove { // Код, реализующий изъятие делегата из списка вызова // события. } }

Единственное, что может смутить при рассмотрении кода, так это то, что add и remove, по сути дела, являются функциями, принимающими один параметр. Чтобы получить доступ к этому параметру, необходимо воспользоваться ключевым словом value.

При использовании расширенного режима компилятор не будет автоматически описывать поле-делегат, и его придется вводить самостоятельно. Рассмотрим пример, демонстрирующий работу данного подхода (листинг 14). Этот пример по функциональности и внутренней архитектуре будет аналогичен предыдущему, только код поддержки работы с событием будет реализован в нем вручную.

Листинг 14. Поддержка событий в ручном режиме.

using System; // Опишем делегат, имеющий пустой прототип. delegate void MyDelegate(); // Опишем подопытный класс/компонент. class Button { // Закрытое поле-ссылка на экземпляр делегата, // который будет обслуживать событие. private MyDelegate _click; // Пользовательское событие, с возможностью контроля доступа // к нему. public event MyDelegate Click { // Эта функция будет вызвана при попытке добавления // делегата в список вызова события. add { // Сообщим пользователю о том, что произведена // попытка добавить делегат. Console.WriteLine("add handler was invoked"); // Добавим делегат в список вызова. _click += value; } // Эта функция будет вызвана при попытке изъятия // делегата из списка вызова события. remove { // Сообщим о том, что произведена попытка // изъять делегат из списка вызова. Console.WriteLine("remove handler was invoked"); // Удалим эту функцию из списка обработки. _click -= value; } } // Эта функция необходима для того, чтобы // симулировать событие нажатия на кнопку. public void SimulateClick() { // Вызываем функции, связанные с событием Click, // предварительно проверив, зарегистрировался // ли кто-нибудь в этом событии. if (Click != null) Click(); } };   class App { public static void Main() { // Создадим тестовый экземпляр компонента/класса. Button sc = new Button(); // Добавим обработчик события. sc.Click += new MyDelegate(Handler); // Косвенно вызовем функцию нашего обработчика. sc.SimulateClick(); // Уберем функцию-обработчик из списка вызова sc.Click -= new MyDelegate(Handler); // Попытаемся снова осуществить вызов. sc.SimulateClick(); } // Функция-обработчик для компонента/класса. public static void Handler() { Console.WriteLine("Hello World - Handler was invoked"); } };

В результате работы примера получим на консоли следующие строки.

add handler was invoked Hello World - Handler was invoked remove handler was invoked

Как видим, приложение действовало по заданной схеме, контролируя при этом добавление и изъятие делегатов.

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

Пример паттерна наблюдатель по полной форме.

 


II Задание

Общее задание:

При помощи механизма события по полной форме создать класс для данных(наследник EventArgs), Создать класс наблюдатель и создать класс-источник. При подписки(отписки) одного из наблюдателей выводить сообщения на консоль соответствующее специфики задачи.

Варианты:

 

1. Создать класс аукцион(источник). В котором всем посетителям передается информация о лоте(класс данные: цена, название, год создание, автор), который выставлен и каждый подписчик может изменить его стоимость. И тут же должны быть освещены о том, что это произошло.

 

 

2. Создать класс метео центр(истоник). В котором всем метеостанциям каждая находится в своем округе передается информация о погоде(класс данные скорость ветра, температура, округ), Как только в каком-то округе данные меняются необходимо сообщить все остальные метеостанции.

3. Создать класс преподаватель(истоник). При помощи которого надо провести урок «Знакомьтесь это я» в котором все ученики рассказывают о себе(класс данных: имя, возраст, пол, хобби(массив стринг), домашний питомец). Ученики по очереди встают и рассказывают о себе преподавателю, а он передает эти данные всем ученикам) .

4. Создать класс чат-сервер(истоник). При помощи которого надо передавать сообщения пользователей (класс данных: сообщение, дата). Пользователи(наблюдателе) произвольно могут написать сообщение и оно передастся сразу всем(т.е. использовать сокеты или как-то ограничивать сообщения не надо) .

 

III. Контрольные вопросы

Вопросы для контроля

1. Что такое событие?

2. Какую конструкцию оно заменяет?

3. Что значит событие в полной форме?

4. Классы, которые необходимы событиям в полной форме.

5. Принцип паттерна наблюдатель?

 

Литература

1. Полный справочник по С#. Г. Шилдт. Издательский дом «Вильямс», 2004.

2. С# в подлиннике. Наиболее полное руководство. Х.Дейтел.

3. C# в задачах и примерах. Культин. Н.Б.

4. С# учебный курс. Г.Шилдт. СПб.: Питер, 2002.

5. С# программирование на языке высокого уровня Павловская Т.А. СПб.: БХВ-Петербург.

 



2016-01-26 343 Обсуждений (0)
Контроль над событиями 0.00 из 5.00 0 оценок









Обсуждение в статье: Контроль над событиями

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Почему люди поддаются рекламе?: Только не надо искать ответы в качестве или количестве рекламы...
Генезис конфликтологии как науки в древней Греции: Для уяснения предыстории конфликтологии существенное значение имеет обращение к античной...
Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (343)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.006 сек.)