Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Public delegate void Handler(int value); // Объявление делегата (2)
int main() { Handler^ handler = gcnew Handler(HandlerClass::Fun1); // Создание объекта делегата (3) Console::WriteLine("Делегат с одним указателем " + "на статическую функцию:"); // Вызов делегата с явным вызовом функции Invoke (4) handler -> Invoke (90); // Добавление функции Fun 2 в список вызовов делегата handler (5) handler += gcnew Handler(HandlerClass::Fun2); Console::WriteLine("\nДелегат с двумя указателями " + "на статические функции:"); // Вызов делегата с явным вызовом функции Invoke (6) handler->Invoke(80); HandlerClass^ obj = gcnew HandlerClass; // Создание экземпляра класса (7) Handler^ handler2 = gcnew Handler(obj, &HandlerClass::Fun3); // Создание объекта делегата (8) handler += handler 2; // Добавление функции (9) Console:: WriteLine ("\ n Делегат с тремя указателями " + "на функции:"); // Сокращенный вариант оператора вызова делегата (10) handler (70); Console:: WriteLine ("\ n Сокращение списка вызовов..."); // Удаление функции Fun 1 из списка вызовов делегата handler (11) handler -= gcnew Handler(HandlerClass::Fun1); Console::WriteLine("Делегат с указателями на одну " + "статическую и одну функцию экземпляра:"); // Сокращенный вариант оператора вызова делегата (12) handler(60); Console::ReadLine(); return 0; } /* Вывод: Делегат с одним указателем на статическую функцию: Функция1 вызвана со значением 90 Делегат с двумя указателями на статические функции: Функция1 вызвана со значением 80 Функция2 вызвана со значением 80 Делегат с тремя указателями на функции: Функция1 вызвана со значением 70 Функция2 вызвана со значением 70 Функция3 вызвана со значением 71 Сокращение списка вызовов... Делегат с указателями на одну статическую и одну функцию экземпляра: Функция2 вызвана со значением 60 Функция3 вызвана со значением 61 */
Пример. Объявление типа делегата MyHandler, способного указывать только на функции с типом возвращаемого значения void и двумя параметрами: первый типа double, а второй – типа String^.
delegate void MyHandler(double x, String^ description);
Несвязанные делегаты. Пример 14.16. Использование несвязанного делегата.
# include " stdafx. h " using namespace System; public ref class ThisClass { // Определение ссылочного класса (1)
public: void Sum(int n) { // Функция экземпляра Console::WriteLine("Результат сложения = {0}", value + n); } void Product(int n) { // Функция экземпляра Console::WriteLine("Результат умножения = {0}", value * n); } ThisClass(double v): value(v) {} // Конструктор private: double value; // Закрытое поле }; public delegate void UBHandler(ThisClass^, int value); // Объявление несвязанного делегата (2) int main () { // Создание массива указателей на объекты класса ThisClass (3) array<ThisClass^>^ things = { gcnew ThisClass(5.1), gcnew ThisClass(10.3), gcnew ThisClass(15.1), gcnew ThisClass(20.3), gcnew ThisClass(25.1) }; UBHandler^ ubh = gcnew UBHandler(&ThisClass::Sum); // Создание объекта делегата (4) // Вызов делегата с каждым элементом массива for each (ThisClass^ thing in things) ubh(thing, 3); // Вызов делегата (5) ubh += gcnew UBHandler(&ThisClass::Product); // Добавить функцию к делегату (6) // Вызовы нового делегата с каждым элементом массива for each (ThisClass^ thing in things) ubh(thing, 2); // Вызов делегата (7) Console::ReadLine(); return 0; } /* Вывод: Результат сложения = 8,1 Результат сложения = 13,3 Результат сложения = 18,1 Результат сложения = 23,3 Результат сложения = 28,1 Результат сложения = 7,1 Результат умножения = 10,2 Результат сложения = 12,3 Результат умножения = 20,6 Результат сложения = 17,1 Результат умножения = 30,2 Результат сложения = 22,3 Результат умножения = 40,6 Результат сложения = 27,1 Результат умножения = 50,2 */
Когда вызывается несвязанный делегат, то первым параметром должен быть объект, для которого вызываются функции из списка вызовов, а все последующие параметры – это параметры данных функций. Например, делегат ubh может быть вызван так:
ThisClass ^ obj = gcnew ThisClass (99.3); ubh (obj, 5);
События (http://msdn.microsoft.com/ru-ru/library/windows/apps/hh755799.aspx) Пример 14.17. Использование классов для определения, порождения и обработки событий.
#include "stdafx.h" using namespace System; public delegate void DoorHandler(String^ str); // Объявление делегата (1) public ref class Door { // Определение класса с членом-событием (2)
public: // Объявление события, которое вызывает функции, // ассоциированные с объектом делегата DoorHandler (3) event DoorHandler ^ Knock; void TriggerEvents() { // Функция, инициирующая события (4) Knock ("Иван"); // Порождение события (5) Knock ("Петр"); // Порождение события (6) } }; // Класс, определяющий функции-обработчики событий Knock (7) public ref class AnswerDoor { public: void ImIn(String^ name) { // функция - обработчик события (8) Console::WriteLine(" Заходи, {0}, открыто.", name); } void ImOut(String^ name) { // функция - обработчик события (9) Console::WriteLine(" Уходи, {0}, меня нет.", name); } }; int main() { Door^ door = gcnew Door; // Создание объекта класса Door (10) AnswerDoor^ answer = gcnew AnswerDoor; // Создание объекта класса AnswerDoor (11) // Добавить обработчик события Knock - члена door (12) door->Knock += gcnew DoorHandler(answer, &AnswerDoor::ImIn); door -> TriggerEvents (); // Инициирование события Knock (13) // Изменить способ обработки события Knock (14) door->Knock -= gcnew DoorHandler(answer, &AnswerDoor::ImIn); door->Knock += gcnew DoorHandler(answer, &AnswerDoor::ImOut); door->TriggerEvents(); // Инициирование события Knock (15) Console::ReadLine(); return 0; } /* Вывод: Заходи, Иван, открыто. Заходи, Петр, открыто. Уходи, Иван, меня нет. Уходи, Петр, меня нет. */
|
||||||
Последнее изменение этой страницы: 2019-05-20; просмотров: 125; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.15.147.53 (0.013 с.) |