Вызов делегата. Объединение экземпляров делегатов.
Синтаксис "вызова" делегата совпадает с синтаксисом вызова метода. Делегат не является сам по себе методом, но он инкапсулирует метод. Делегат "передает" вызов инкапсулированному методу, потому и называется делегатом (от англ, delegate – поручать, уполномочивать). В приведенном ниже фрагменте кода делегат notifyDlg вызывается в случае, если при выплате со счета получается отрицательный баланс. В этом примере экземпляр notifyDlg инициализируется в методе SetDelegate.
_gc class Account // класс сборщика мусора Счет { private: // частный Decimal balance; // Десятичный баланс NotifyCallback *pNotifyDlg; void SetDelegate(NotifyCallback *pDlg) { pNotifyDlg = pDlg; } void Withdraw(Decimal amount) // Десятичное количество { balance = balance – amount; // баланс = баланс – количество; if (balance < 0) // если баланс <0, ситуация овердрафта pNotifyDlg(balance); callback // баланс, обратный вызов }
Объединение экземпляров делегатов
Несколько делегатов можно объединить в один так, чтобы результирующий делегат имел список вызываемых методов. При вызове подобного делегата будут вызваны по очереди все методы, содержащиеся в списке вызываемых методов этого делегата. Полезным свойством делегатов является возможность объединять списки вызываемых делегатом методов и удалять методы из таких списков. Для этого используются статические методы Delegate::Combine (Делегат::Объединение) и Delegate::Remove (Делегат::Удалить). Кроме того, для класса Delegate (Делегат) операторы += и -= перегружены так, чтобы обеспечить сокращенный синтаксис добавления и удаления методов.
// псевдокод: pCurrDlg = pCustDlg + pBankDlg pCurrDlg = static_cast<NotifyCallback *>( Delegate::Combine(pCustDlg, pBankDlg)); // Делегат::Объединение // дополнительный код: pCurrDlg – = pBankDlg pCurrDlg = static_cast<NotifyCallback *>( Delegate::Remove(pCurrDlg, pBankDlg)); // Делегат::Удалить // дополнительный код: pCurrDlg + = plnstDlg pCurrDlg = static_cast<NotifyCallback *>( Delegate::Combine(pCurrDlg, plnstDlg)); // Делегат: Объединение
В этом примере мы создаем два экземпляра делегатов для статических методов и один – для метода экземпляра класса. Пример демонстрирует некоторые возможности добавления методов в список и удаления их из него, а также вызов методов, связанных с делегатом. Этот пример, с подробным описанием важных аспектов использования делегатов, приведен в следующем разделе главы.