|
Программирование >> Обработка исключительных ситуаций
:lass Classl static void MainO Subj s ObsA ol new SubjO; new ObsA(); new ObsAO; объект класса-источника объекты класса-наблюдателя s.Register( new Del( ol.Do ) ); s.Register( new Del( o2.Do ) ); s.Register( new Del( ObsB.See ) ); регистрация методов наблюдателей в источнике ( экземпляры делегата ) s.OOPSO; инициирование события источнике объявляется экземпляр делегата, в этот экземпляр заносятся мето-тех объектов, которые хотят получать уведомление об изменении состояния гочника. Этот процесс называется регистрацией делегатов. При регистрации (я метода добавляется к списку. Обратите внимание: для статического метода азывается имя класса, а для обычного метода - имя объекта. При наступлении аса X все зарегистрированные методы поочередно вызываются через делегат. :зультат работы программы: жу. что OOPS! жу, что OOPS! тоже вижу, что OOPS! ля обеспечения обратной связи между наблюдателем и источником делегат объ-влен с параметром типа object, через который в вызываемый метод передается ;ылка на вызывающий объект. Следовательно, в вызываемом методе можно поучать информацию о состоянии вызывающего объекта и посылать ему сообще-ия (то есть вызывать методы этого объекта). Звязь источник - наблюдатель устанавливается во время выполнения про-раммы для каждого объекта по отдельности. Если наблюдатель больше не хочет юлучать уведомления от источника, можно удалить соответствующий метод из писка делегата с помощью метода Remove или перегруженной операции вычита-гая, например: jublic void UnRegister( Del d ) удаление делегата dels -= d; Операции Делегаты можно сравнивать на равенство и неравенство. Два делегата равн1, если они оба не содержат ссылок на метод1 или если они содержат ссылки на одни и те же метод1 в одном и том же порядке. Сравнивать можно даже делегаты различных типов при условии, что они имеют один и тот же тип возвращаемого значения и одинаковые списки параметров. ПРИМЕЧАНИЕ- Делегаты, различающиеся только именами, считаются имеющими разные типы. С делегатами одного типа можно выполнять операции простого и сложного присваивания, например: Del dl = new Del( ol.Do ): ol.Do Del d2 = new Del( o2.Do ); o2.Do Del d3 = dl + d2; ol.Do и o2.Do d3 += dl: ol.Do. o2.Do и ol.Do d3 -= d2; Ol.Do и ol.Do Эти операции могут понадобиться, например, в том случае, если в разных обстоятельствах требуется вызывать разные наборы и комбинации наборов методов. Делегат, как и строка string, является неизменяемым типом данных, поэтому при любом изменении создается новый экземпляр, а старый впоследствии удаляется сборщиком мусора. Передача делегатов в методы Поскольку делегат является классом, его можно передавать в методы в качестве параметра. Таким образом обеспечивается функциональная параметризация: в метод можно передавать не только различные данные, но и различные функции их обработки. Функциональная параметризация применяется для создания универсальных методов и обеспечения возможности обратного вызова. В качестве простейшего примера универсальною метода можно привести метод вывода таблицы значений функции, в который передается диапазон значений аргумента, шаг его изменения и вид вычисляемой функции. Этот пример приводится далее. Обратный вызов (callback) представляет собой вызов функции, передаваемое в другую функцию в качестве параметра. Рассмотрим рис. 10.1. Допустим, в биб лиотеке описана функция А, параметром которой является имя другой функции В вызывающем коде описывается функция с требуемой сигнатурой (В) и переда ется в функцию А. Выполнение функции А приводит к вызову В, то есть управле ние передается из библиотечной функции обратно в вызывающий код. -ь - А(Х) Вызов А (В)- Вызывающий код Вызов X ч у Библиотека Рис. 10.1. Механизм обратного вызова Механизм обратного вызова широко используется в программировании. Например, он реализуется во многих стандартных функциях Windows. Пример передачи делегата в качестве параметра приведен в листинге 10.3. Программа выводит таблицу значений функции на заданном интервале с шагом, равным единице. Листинг 10.3. Передача делегата через список параметров using System: namespace ConsoleApplicationl public delegate double Fun( double x ); объявление делегата class Classl public static void Tablet Fun F, double x, double b ) Console.WriteLineC -X-Y- ); while (x <= b) { Console.WriteLineC {0,8:0.000} {1,8:0.000} . x, F(x)),-x += 1: Console.WriteLineC public static double SimpleC double x ) return 1: static void MainO Console.WriteLineC Таблица функции Sin
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |