Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Пример делегата для работы с несколькими методами

MulticastDelegate.GetInvocationList

Возвращает список делегатов, находящихся в списке вызовов делегата.

public sealed override Delegate[] GetInvocationList();

Существует два недостатка механизма вызова функций, связанных с делегатом. И оба они связаны со случаем, когда в списке вызова делегата присутствует более одной функции.

  • Функции, на которые ссылаются делегаты, могут возвращать значения. Но мы их получить не сможем, поскольку штатная функция вызова Invoke возвращает значение, которая вернула последняя из опрошенных функций.
  • При обращении к делегату, содержащему в списке вызова несколько функций, вовсе не гарантируется, что все функции из списка будут вызваны. Если одна из них сгенерирует исключение, то работа метода Invoke будет прервана и остальные функции вызваны не будут.

namespace ConsoleApplication1

{

class Program

{

//объявление делегата

delegate void MyDelegate(string s);

// Первый метод, на который мы будем ссылаться при помощи

// делегата. Именно он будет вызывать исключение,

// не позволяющее обратиться ко второму методу.

static void f1(string s)

{

// Выведем значение переданного параметра,

// а также уведомим пользователя о том, что данный

// метод был вызван.

Console.WriteLine("Функция 1 вызвана с параметром = {0}",s);

// Преднамеренно выбросим исключение.

throw new Exception();

}

// Второй метод, на который мы будем ссылаться из делегата.

static void f2(string s)

{

// Сообщим пользователю о том, что метод

// был вызван, а также выведем значение переданного параметра.

Console.WriteLine("Функция 2 вызывана с параметром = {0}",s);

}

static void Main(string[] args)

{

 

MyDelegate del = new MyDelegate(f1);

// Присоединим к нему еще одну функцию.

del += new MyDelegate(f2);

// Последовательно пройдем по каждому делегату, входящему

// в список вызова ранее созданного делегата.

foreach (MyDelegate d in del.GetInvocationList())

{

// вызов функции - в защищенный блок!

try

{

d("Hello");

}

// Это блок обработки исключений, произошедших

// в защищенном блоке.

catch(Exception ex)

{

// Сообщим пользователю о том, что при попытке

// вызова одной из функций произошло исключение.

Console.WriteLine("Oh mama, была обнаружена исключительная ситуация!");

}

}

Console.ReadKey(); } }}

2. Делегат как оповещатель. Паттерн «наблюдатель»

Паттерн – шаблон проектирования (одна и та жа схема организации и взаимодействия объектов в различных ситуациях). Существует несколько паттернов программирования, одним из которых является «паттерн наблюдатель».

Наблюдатели синхронизировали свое состояние с источником
Объект, называемый источником при изменении своего состояния, может представлять интерес для других объектов, по этому он должен посылать им извещение о том, что у него, что-то произошло. Такие объекты, получив извещение должны обновить своё состояние, что бы синхронизировать своё состояние с объектом источником. Такие объекты называются наблюдателями. Наблюдатель1

Наблюдатель2

Наблюдатель n

Изменил состояние – послал всем наблюдателям извещение

<== предыдущая лекция | следующая лекция ==>
Делегат для выбора методов на этапе выполнения | Пример передачи делегата в качестве параметра функции
Поделиться с друзьями:


Дата добавления: 2014-01-20; Просмотров: 433; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.