Программирование >>  Обработка исключительных ситуаций 

1 ... 71 72 73 [ 74 ] 75 76 77 ... 142


: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



1 ... 71 72 73 [ 74 ] 75 76 77 ... 142

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика