Public delegate void Handler(int value); // Объявление делегата (2) 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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 с.)