- •Лекция 20, 21. Делегаты и события
- •Пример делегата для обычной функции
- •Пример делегата для метода класса
- •1.Делегат для выбора методов на этапе выполнения
- •Delegate.Invoke или что там внутри? (для продвинутых)
- •MulticastDelegate.GetInvocationList
- •Пример делегата для работы с несколькими методами
- •2. Делегат как оповещатель. Паттерн «наблюдатель»
- •Пример делегата для оповещения наблюдателей
- •3. Делегат как процедура обратного вызова
- •Пример передачи делегата в качестве параметра функции
- •4.Делегат, как обработчик событий
- •[Cпецификаторы] event тип делегата имя события, где
- •Пример делегата для оповещения наблюдателей с помощью событий
- •Стандартные делегаты
- •Пример стандартного делегата EventHandler для оповещения наблюдателей с помощью событий
2. Делегат как оповещатель. Паттерн «наблюдатель»
Паттерн – шаблон проектирования (одна и та жа схема организации и взаимодействия объектов в различных ситуациях). Существует несколько паттернов программирования, одним из которых является «паттерн наблюдатель».
О Наблюдатели
синхронизировали свое состояние с
источником
Источник
Наблюдатель2
…

Наблюдатель n
Изменил состояние – послал всем наблюдателям извещение
Пример делегата для оповещения наблюдателей
namespace ConsoleApplication1
{
delegate void MyDelegate(object o);
class Источник
{
//Делегат-поле класса
MyDelegate del;
public void Reg(MyDelegate d)
//добавление делегатов
{ del += d; }
//событие, возникающее внутри источника – посылка наблюдателям извещения
public void Event()
{ Console.WriteLine("Событие создано!");
if (del != null) //если в делегате есть функция
del(this);//ВЫПОЛНИТЬ метод, “привязанный” к делегату
}
//удаление делегатов из списка зарегистрированных
public void UnReg(MyDelegate d)
{ del -= d; }
}
class Наблюдатель1
{
//”подходящий” делегту метод
public void Do_Event_1(object o)
{Console.WriteLine("ВИЖУ, что произошло событие!!!"); }
}
class Наблюдатель2
{
public static void Do_Event_2(object o)
{ Console.WriteLine("Я тоже ВИЖУ, что произошло событие!!!"); }
}
class Program
{static void Main(string[] args)
{ Источник A = new Источник();
Наблюдатель1 B = new Наблюдатель1();
Наблюдатель1 C = new Наблюдатель1();
//зарегистрировали делегат (создали его экземпляр), “привязали” к нему метод
A.Reg(new MyDelegate(B.Do_Event_1));
A.Reg(new MyDelegate(С.Do_Event_1));
//то же самое, только для СТАТИЧЕСКОГО метода
A.Reg(new MyDelegate(Наблюдатель2.Do_Event_2));
A.Event();
//убрали одного наблюдателя для источника
A.UnReg(new MyDelegate(B.Do_Event_1));
A.Event();
Console.ReadKey(); } }}
3. Делегат как процедура обратного вызова
Так как делегат является классом, его можно передавать в методы в качестве параметра. Это называется функциональной параметризацией. Функциональная параметризация применяется для создания универсальных методов (например, метод вывода таблицы значений функции) и возможности обеспечения обратного вызова.
Обратный вызов (callback) представляет собой вызов функции, передаваемой в другую функцию в качестве параметра.
В качестве примера “универсального” метода и демонстрации обратного вызова функции рассмотрим передачу делегата в качестве параметра метода, который выводит на экран таблицу значений функции. В качестве параметров выступают диапазон значений аргумента, шаг его измерений и вид вычисляемой функции (ДЕЛЕГАТ).
