События

Public static void sampleMethod(string message)

Class SampleClass

Цепочки делегатов

Цепочка делегатов позволяет создавать связный список делегатов, так что когда вызывается делегат, находящийся в начале списка, вслед за ним выполняются все делегаты цепочки. Класс System.Delegate предоставляет несколько статических методов для управления списком делегатов. При создании списков делегатов применяются следующие методы, объявленные в типе System.Delegate:

public class Delegate: ICloneable, ISerializable

{ public static Delegate Combine(Delegate []);

public static Delegate Combine(Delegate first, Delegate second);

}

Обратите внимание, что методы Combine принимают делегаты для связи в цепочку и возвращают другой Delegate. Возвращенный Delegate представляет собой новый экземпляр MulticastDelegate, унаследованный от Delegate, потому что экземпляры Delegate являются неизменяемыми.

Как видите, первая версия Combine, приведенная выше, принимает массив делегатов, чтобы сформировать непрерывную цепочку делегатов, а вторая форма принимает

... (с.287)

5. Делегаты (MSDN_ООП_VB+C#_2010)

Делегат – это тип, который определяет сигнатуру метода и может обеспечивать связь с любым методом с совместимой сигнатурой. Метод можно запустить (или вызвать) с помощью делегата. Делегаты используются для передачи методов в качестве аргументов к другим методам.

Примечание. Обработчики событий – это ничто иное, как методы, вызываемые с помощью делегатов. Дополнительные сведения об использовании делегатов при обработке событий см. в разделе События и делегаты.

Создание делегата:

public delegate void SampleDelegate(string str);

Создание ссылки на метод, сигнатура которого соответствует сигнатуре, указанной делегатом:

{ // Метод, который соответствует сигнатуре SampleDelegate.

{ // Код метода.

}

// Метод, который иллюстрирует делегат.

void SampleDelegate()

{ SampleDelegate sd = sampleMethod;

sd("Простая строка");

}

}

События. (MSDN_ООП_VB+C#_2010)

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

Во многих случаях использования делегатов в качестве механизма обратного вызова может понадобиться просто известить кого-то о наступлении некоторого события вроде щелчка на кнопке в пользовательском интерфейсе. Предположим, что проектируется приложение медиа-проигрывателя. Где-то в пользовательском интерфейсе имеется кнопка "Play" (Воспроизведение). В хорошо спроектированной системе пользовательский интерфейс отделен от логики управления с помощью четко определенной абстракции, обычно реализуемой через шаблон Bridge (Мост). Абстракция облегчает последующее изменение пользовательского интерфейса или, что еще лучше, поскольку этот интерфейс зависит от платформы – облегчает перенос приложения на другую платформу. Например, шаблон Bridge хорошо работает в ситуациях, когда требуется отделить логику управления от пользовательского интерфейса.

На заметку! Смысл шаблона Bridge, согласно книге Эриха Гаммы (Erich Gamma), Ричарда Хелма (Richard Helm), Ральфа Джонсона (Ralph Johnson) и Джона Влиссидеса (John Vlissides) Design Patterns: Elements of Reusable Object-Oriented Software (Addison-Professional,1995), заключается в отделении абстракции от реализации, чтобы то и другое можно было менять независимо.

Используя шаблон Bridge, можно облегчить сценарий, при котором изменения, происходящие в ядре системы, не влекут за собой изменений в пользовательском интерфейсе и, что более важно, при котором изменения в пользовательском интерфейсе не требуют изменений в ядре системы. Один распространенный способ реализации этого шаблона предусматривает создание в ядре системы четко определенных интерфейсов, через которые пользовательский интерфейс взаимодействует с системой, и наоборот. Однако в таких ситуациях определение интерфейсных типов является громоздким и далеким от идеала. С другой стороны, делегаты представляют собой блестящий механизм для использования в сценариях подобного рода. С помощью делегата можно сформулировать абстрактные вещи следующим образом: "Когда пользователь пожелает включить воспроизведение, необходимо, чтобы были вызваны зарегистрированные методы, принимающие всю необходимую информацию для выполнения данного действия". Прелесть заключается в том, что ядро системы не волнует, как именно пользователь укажет пользовательскому интерфейсу о том, что он желает включить воспроизведение. Это может быть щелчок на кнопке или срабатывание какого-то устройства, улавливающего мозговые волны и угадывающего мысли пользователя. Для системы это не имеет значения, и в любой момент можно изменить любой компонент взаимодействия, не затрагивая остальное. Обе стороны выполняют требования согласованного контракта, который в данном случае включает специально сформированный делегат и средства его регистрации в генерирующей события сущности.

Этот шаблон использования, также известный под названием "издатель/подписчик" (publish/subscribe), настолько распространен, даже за пределами мира разработки пользовательских интерфейсов, что проектировщики исполняющей системы.NET позаботились об определении формализованного встроенного механизма событий. При объявлении события внутри класса компилятор реализует скрытые методы, позволяющие регистрировать и отменять регистрацию делегатов, которые вызываются при наступлении определенных событий. По сути, событие – это сокращение, позволяющее сэкономить время, которое понадобилось бы для написания методов регистрации и отмены регистрации, управляющих цепочкой делегатов. Давайте взглянем на простой пример события, основанный на вышесказанном.

using System;

// Аргументы, переданные от пользовательского интерфейса

// при возникновении события включения воспроизведения.

public class PlayEventArgs: EventArgs

{ public PlayEventArgs(string filename)

{ this.filename = filename;

}

private string filename;


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: