Объявление делегата. Определение метода. Создание экземпляра делегата.
В управляемом C++ делегат объявляется с помощью особого обозначения – ключевого слова _delegate (делегат) – и сигнатуры инкапсулированного метода. В соответствии с соглашением об именовании, имя делегата должно заканчиваться буквосочетанием "Callback". Приведем пример объявления делегата:
_delegate void NotifyCallback(Decimal balance); // делегировать NotifyCallback (Десятичный баланс);
Определение метода
После инициализации делегата следует определить метод обратного вызова, сигнатура которого соответствует сигнатуре, описанной в объявлении делегата. Метод может быть как статическим, так и методом экземпляра класса. Приведем несколько примеров методов, которые могут использоваться с объявленным выше делегатом NotifyCalIback:
static void NotifyCustomer(Decimal balance) // Десятичный баланс { Console::WriteLine("Dear customer,"); // Дорогой клиент Console::WriteLine( " Account overdrawn, balance = {0}", // баланс на счете _box(balance)); // баланс } static void NotifyBank(Decimal balance) // Десятичный баланс { Console::WriteLine("Dear bank,"); // Дорогой банк Console::WriteLine( " Account overdrawn, balance = {0}", // баланс на счете _box(balance)); } void Notifylnstance(Decimal balance) // Десятичный баланс { Console::WriteLine("Dear instance,"); // Дорогой представитель Console::WriteLine( " Account overdrawn, balance = {0}", // баланс на счете _box(balance)); // баланс }
Создание экземпляра делегата
Экземпляр делегата инициализируется с помощью оператора new (создать), так же, как и для любого другого класса. Ниже приведен код, демонстрирующий создание двух экземпляров делегатов. Первый из них связан со статическим методом, второй – с методом экземпляра класса. Второй экземпляр делегата хранит как точку входа в метод, так и экземпляр класса, который используется для вызова метода.
// создать делегат для статического метода NotifyCustomer NotifyCallback *pCustDlg = new NotifyCallback( 0, // ноль для статического метода NotifyCustomer NotifyCustomer); // создать делегат для экземпляра метода Notifylnstance NotifyCallback *p!nstDlg = new NotifyCallback( pda, // отличный от нуля для экземпляра метода Notifylnstance Notifylnstance);