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

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



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

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

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

©Павловская Т.А. (СПбГУ ИТМО) Лекция 9. Интерфейсы. Контейнерные классы Описание и использование интерфейсов. Применение стандартных интерфейсов.NET для сравнения, перебора, сортировки и клонирования объектов. Понятие контейнера (коллекции). Использование стандартных коллекций.NET.

©Павловская Т.А. (СПбГУ ИТМО) Делегаты

©Павловская Т.А. (СПбГУ ИТМО) Определение делегата Делегат это вид класса, предназначенный для хранения ссылок на методы. Делегат, как и любой другой класс, можно передать в качестве параметра, а затем вызвать инкапсулированный в нем метод. Делегаты используются для поддержки событий, а также как самостоятельная конструкция языка. Описание делегата задает сигнатуру методов, которые могут быть вызваны с его помощью: [ атрибуты ] [ спецификаторы ] delegate тип имя([ параметры ]) Пример описания делегата: public delegate void D ( int i ); Базовым классом делегата является класс System.Delegate

©Павловская Т.А. (СПбГУ ИТМО) Использование делегатов Делегаты применяются в основном для следующих целей: получения возможности определять вызываемый метод не при компиляции, а динамически во время выполнения программы; обеспечения связи между объектами по типу «источник наблюдатель»; создания универсальных методов, в которые можно передавать другие методы (поддержки механизма обратных вызовов).

©Павловская Т.А. (СПбГУ ИТМО) Обратный вызов (callback) библиотека вызов Х A ( X ) вызывающий код B вызов A ( B )

©Павловская Т.А. (СПбГУ ИТМО) Передача делегата через список параметров namespace ConsoleApplication1 { public delegate double Fun( double x ); // объявление делегата class Class1 { public static void Table( Fun F, double x, double b ) { Console.WriteLine( " X Y -----" ); while (x

©Павловская Т.А. (СПбГУ ИТМО) Операции Делегаты можно сравнивать на равенство и неравенство. Два делегата равны, если они оба не содержат ссылок на методы или если они содержат ссылки на одни и те же методы в одном и том же порядке. С делегатами одного типа можно выполнять операции простого и сложного присваивания. Делегат, как и строка string, является неизменяемым типом данных, поэтому при любом изменении создается новый экземпляр, а старый впоследствии удаляется сборщиком мусора. Использование делегата имеет тот же синтаксис, что и вызов метода. Если делегат хранит ссылки на несколько методов, они вызываются последовательно в том порядке, в котором были добавлены в делегат.

©Павловская Т.А. (СПбГУ ИТМО) События

©Павловская Т.А. (СПбГУ ИТМО) Определение события Событие элемент класса, позволяющий ему посылать другим объектам (наблюдателям) уведомления об изменении своего состояния. Чтобы стать наблюдателем, объект должен иметь обработчик события и зарегистрировать его в объекте- источнике Источник: - Описано событие OOPS - Иниц-я события OOPS Наблюдатель 1: -Обработчик события OOPS (реакция на это событие) Наблюдатель 2: - Обработчик события OOPS (реакция на это событие) регистрация Наблюдатель 3: - Обработчик события OOPS (реакция на это событие)

©Павловская Т.А. (СПбГУ ИТМО) Пример class Subj { // Класс-источник события public event EventHandler Oops; // Описание события станд. типа public void CryOops() { // Метод, инициирующий событие Console.WriteLine( "OOPS!" ); if ( Oops != null ) Oops( this, null ); } } class Obs { // Класс-наблюдатель public void OnOops( object sender, EventArgs e ) { // Обработчик соб-я Console.WriteLine( «Оййй!" ); } } class Class1 { static void Main() { Subj s = new Subj(); Obs o1 = new Obs(); Obs o2 = new Obs(); s.Oops += o1.OnOops; // регистрация обработчика s.Oops += o2.OnOops; // регистрация обработчика s.CryOops(); } } OOPS! Оййй!

©Павловская Т.А. (СПбГУ ИТМО) Механизм событий События построены на основе делегатов: с помощью делегатов вызываются методы-обработчики событий. Поэтому создание события в классе состоит из следующих частей: описание делегата, задающего сигнатуру обработчиков событий; описание события; описание метода (методов), инициирующих событие. Синтаксис события: [ атрибуты ] [ спецификаторы ] event тип имя

©Павловская Т.А. (СПбГУ ИТМО) Пример public delegate void Del( object o ); // объявление делегата class A { public event Del Oops; // объявление события... }

©Павловская Т.А. (СПбГУ ИТМО) Обработка событий выполняется в классах-получателях сообщения. Для этого в них описываются методы- обработчики событий, сигнатура которых соответствует типу делегата. Каждый объект (не класс!), желающий получать сообщение, должен зарегистрировать в объекте- отправителе этот метод. Событие это удобная абстракция для программиста. На самом деле оно состоит из закрытого статического класса, в котором создается экземпляр делегата, и двух методов, предназначенных для добавления и удаления обработчика из списка этого делегата. Внешний код может работать с событиями единственным образом: добавлять обработчики в список или удалять их, поскольку вне класса могут использоваться только операции += и -=. Тип результата этих операций void, в отличие от операций сложного присваивания для арифметических типов. Иного способа доступа к списку обработчиков нет.

©Павловская Т.А. (СПбГУ ИТМО) Пример public delegate void Del(); // объявление делегата class Subj // класс-источник { public event Del Oops; // объявление события public void CryOops() // метод, инициирующий событие { Console.WriteLine( "OOPS!" ); if ( Oops != null ) Oops(); } } class ObsA // класс-наблюдатель { public void Do(); // реакция на событие источника { Console.WriteLine( "Вижу, что OOPS!" ); } } class ObsB // класс-наблюдатель { public static void See() // реакция на событие источника { Console.WriteLine( "Я тоже вижу, что OOPS!" ); } }

©Павловская Т.А. (СПбГУ ИТМО) class Class1 { static void Main() { Subj s = new Subj(); // объект класса-источника ObsA o1 = new ObsA(); // объекты ObsA o2 = new ObsA(); // класса-наблюдателя s.Oops += new Del( o1.Do ); // добавление s.Oops += new Del( o2.Do ); // обработчиков s.Oops += new Del( ObsB.See ); // к событию s.CryOops(); // инициирование события }

©Павловская Т.А. (СПбГУ ИТМО) Еще немного про делегаты и события Делегат можно вызвать асинхронно (в отдельном потоке), при этом в исходном потоке можно продолжать вычисления. Анонимный делегат (без создания класса-наблюдателя): s.Oops += delegate ( object sender, EventArgs e ) { Console.WriteLine( "Я с вами!" ); }; Делегаты и события обеспечивают гибкое взаимодействие взаимосвязанных объектов, позволяющее поддерживать их согласованное состояние. События включены во многие стандартные классы.NET, например, в классы пространства имен Windows.Forms, используемые для разработки Windows-приложений.