КАТЕГОРИИ: Архитектура-(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 Возвращает список делегатов, находящихся в списке вызовов делегата.
Существует два недостатка механизма вызова функций, связанных с делегатом. И оба они связаны со случаем, когда в списке вызова делегата присутствует более одной функции.
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
…
Наблюдатель n Изменил состояние – послал всем наблюдателям извещение
Дата добавления: 2014-01-20; Просмотров: 433; Нарушение авторских прав?; Мы поможем в написании вашей работы! |