Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 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; просмотров: 197; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.217.21 (0.006 с.) |