Высокоуровневые методы информатики и программирования Лекция 10 События.

Презентация:



Advertisements
Похожие презентации
©Павловская Т.А. (СПбГУ ИТМО) Курс «С#. Программирование на языке высокого уровня» Павловская Т.А.
Advertisements

Высокоуровневые методы информатики и программирования Лекция 9 Делегаты.
СОБЫТИЯ Лекция 1. Взаимодействие объектов 2 Взаимодействие между объектами A и B можно организовать двумя способами. 1.Объект A вызывает метод объекта.
ДЕЛЕГАТЫ Лекция 7 1. Зачем нужны делегаты 2 И данные, и код располагаются в памяти компьютера по определенным адресам. Передача адресов данных в C# происходит.
Обработка исключительных ситуаций Исключительная ситуация (исключение) – это ошибка, возникающая во время выполнения программы. Например, ошибка работы.
Основы информатики Классы Заикин Олег Сергеевич zaikin.all24.org
CобытияCобытияСобытия События представляют собой механизм, посредством которого объект имеет возможность получать информацию о происходящем вне него. Объявление.
Особенности C# Индексаторы, события, частичные методы, расширяющие методы, сборщик мусора DraggonZ.
Преобразования типов В языке C/C++ имеется несколько операций преобразования типов. Они используются в случае, если переменная одного типа должна рассматриваться.
Высокоуровневые методы информатики и программирования Лекция 14 Интерфейсы.
Делегаты Делегат эти объект, который безопасно инкапсулирует метод, его действие схоже с указателем функции в C и C++. Делегаты используются для передачи.
Делегаты Как созданные объекты могут посылать сообщения тем объектам, которые их породили? При программировании под Windows на С и C++ основное средство.
События (events) События позволяют классу или объекту уведомлять другие классы или объекты о возникновении каких-либо ситуаций. Событие представляет собой.
Наследование Наследование – это отношение является между классами. class Person { string first_name; int birth_year;... } class Student : Person { float.
События (events) События позволяют классу или объекту уведомлять другие классы или объекты о возникновении каких-либо ситуаций. Событие представляет собой.
Лекция 2: Описание класса 1. Поля 2. Методы 3. Конструкторы.
Статические поля класса Статические поля хранят данные, общие для всех элементов класса. Статическое поле существует в единственном экземпляре для всех.
Лекция 3 Принципы объектно- ориентированного программирования.
События События Важная роль делегатов заключается в том, что на них основана модель событий С#. Применение событий вовсе не ограничено приложениями с графическим.
Классы в С#. Перечисления С# Перечисление задает конечное множество возможных значений, которые могут получать объекты класса перечисление. [атрибуты][модификаторы]
Транксрипт:

Высокоуровневые методы информатики и программирования Лекция 10 События

План работы что такое и для чего используются как создаются как инициируются как обрабатываются

Работа с событиями в C# С помощью делегатов в классах можно описывать события. События это способ взаимодействия между объектами разных классов. – Объекты одного класса могут использовать объекты других классов. – Для этого они создают объекты требуемого класса и вызывают его методы (передают ему сообщения). – При работе вызванных методов часто возникает необходимость передать сообщения о возникших ситуациях (важных изменения в своей работе) объектам вызывающего класса, без завершения их работы. – Для передачи таких сообщений и используются специальные элементы класса – события.

События Сообщение объекта своему пользователю о том, что произошло что-то важное. Например: Выполнена какая-то часть работы Произошла ошибка Пользователь выполнил некоторые действия (переместил мышь, сделал щелчок, нажал клавишу) Вся работа программ с среде ОС Windows основана на событиях Программирование основанное на событиях – event driven programming.

События (2) Обычно класс пользователь (client) вызывает методы используемого класса (server) События позволяют используемому классу вызывать методы пользовательского класса Пользовательский класс Используемый класс Вызов методов Сообщения о событиях Клиент Сервер

События (3) MyClass a; public void MySub() { a = new OtherClass a.SomeEvent += MyHandle; … a.metod(); // вызываем метод с событиями … } void MyHandle(object o, int d) {... } Обработчик события Метод, использующий MyClass Метод класса MyClass с событием SomeEvent: Произошло что-то важное SomeEvent(this, data) Проблема: как объект узнает о том, какую функцию у пользователя вызывать ??? Вызов обработчика события Возврат управления Метод: method() public delegate Handler(…); public event Handler SomeEvent;

Добавление события в класс 1.Создать открытую переменную, которая может хранить ссылки. 2.Когда возникнет нужное событие, то вызвать все методы, ссылки на которые этой переменной будут присвоены.

Объявление события в классе Вначале объявляется делегат, как это рассматривалось ранее. Объявление делегата описывается в некотором классе. Но, часто, это объявление находится вне класса в пространстве имен. public delegate ([параметры]); – Например: public delegate void MyHandler (object o, int n); Объявить событие как экземпляр соответствующего делегата. При этом используется ключевое слово event (это гарантирует, что экземпляр события не может быть вызван в других классах). рublic event ; – Например: public event MyHandler MyEvent; Для инициирования события требуется просто вызвать на выполнение экземпляр делегата. – Например: if (MyEvent != null) // проверка, что для события заданы обработчики MyEvent(this, i); // если есть обработчики, то запускаем событие

Сигнатура обработчика события В FCL все обработчики имеют два параметра public delegate void MyChangeHandler (MyObject o, MyEventArgs i); – EventArgs – базовый класс для всех классов передачи данных о событии – class MyEventArgs : EventArgs {... }

Объявление и инициирование события класса Объявления делегата // делегат, который должны реализовать подписчики public delegate void Handler (object o, EventArgs ea); // объявление событий event public event Handler OnChange; public event Handler OnClick; public event Handler OnMove;

Ключевое слово event Ключевое слово event указывает компилятору, что делегат может вызываться описывающим классом, и что другие классы могут только подписываться и отписываться от делегата используя соответствующие += и -=.

Пример описания события // Объявление нового типа – делегата public delegate void MyHandler (object o, int n); // объявление класса с событием public class ClassWithEvent { // класс с событием // Создание экземпляра делегата - событие public event MyHandler MyEvent; // поле класса private int Volume = 0; // конструктор класса – парамер – объем работы public EventClass(int p){if (p > 0) Volume = p;} //описание метода выполняющего долгую работу (в данном примере бессмысленную) public void LongWork(){ double s = 0; int k = 0; int st = Volume / 10; // десятая часть работы for (int i = 0; i < Volume; i++) { s += Math.Atan(Math.Sqrt(i) * Math.Sqrt(i)); if (k == st) {// выполнена заданная часть работы if (MyEvent != null){ int n = (int)(i*100.0)/Volume; MyEvent(this, n); // запускаем событие } k = 0; } else k += 1; } } }

Обработка событий в классах В классе, который будет обрабатывать событие, нужно: 1.описать метод - обработчик события, который имеет такую же сигнатуру, как у делегата, который задает событие; 2.в одном из методов создать объект, имеющий событие; 3.присвоить ссылку на метод – обработчик события – открытой переменной объекта (событию) с использованием операции +=.

Пример обработки события class Program { const int WorkVolume = ; // объем работы // обработчик события private static void ShowStar(object o, int n) { Console.WriteLine(" Выполнено {0}%", n); //Console.Write("*"); // можно просто выводить * } public static void Main() { // создается объект ClassWithEvent obj=new ClassWithEvent(WorkVolume); // событию задается обработчик obj.MyEvent += new MyHandler(ShowStar); // запускам метод объекта у которого возникает данное событие obj.LongWork(); // ждем нажатия клавиши Console.ReadLine(); }

Подписка и отписка на событие Создание метода, который имеет такую же сигнатуру, что и обработчик события – Handler void f (….); Создать экземпляр делегата Handler a = new Handler (func); Подписаться на событие (obj – объект у которого есть событие) obj.OnChange += a; Отписаться от события (obj – объект у которого есть событие) obj.OnChange -= a; Или Подписаться на событие obj.OnChange += new Handler (func); Отписаться от события obj.OnChange -= new Handler (func);