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(); } }}
Делегат как процедура обратного вызова
Так как делегат является классом, его можно передавать в методы в качестве параметра. Это называется функциональной параметризацией. Функциональная параметризация применяется для создания универсальных методов (например, метод вывода таблицы значений функции) и возможности обеспечения обратного вызова.
Обратный вызов (callback) представляет собой вызов функции, передаваемой в другую функцию в качестве параметра.
В качестве примера “универсального” метода и демонстрации обратного вызова функции рассмотрим передачу делегата в качестве параметра метода, который выводит на экран таблицу значений функции. В качестве параметров выступают диапазон значений аргумента, шаг его измерений и вид вычисляемой функции (ДЕЛЕГАТ).