Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
k_zachetu_po_programmirovaniyu (1).docx
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
1 Мб
Скачать
☆
  1. Делегаты. Назначение, описание и использование.

  • В программе часто требуется хранить и передавать адреса методов.

    • Функции обратного вызова (callback functions, callbacks).

    • Используя callbacks можно указать, чтобы одна функция обращалась к другой функции.

    • С помощью этого подхода разработчики в Win32 могут обрабатывать нажатие клавиш, движение мыши, выбор пунктов меню.

  • Для реализации обратных вызовов в C# используется новый тип delegate (делегат).

  • Объекты данного типа могут хранить ссылки на методы с заданной сигнатурой.

  • Для описания нового типа используется ключевого слова delegate.

    • Новый тип можно описать с помощью класса:

class xxxx

{...}

    • И новый тип можно описать с помощью делегата:

delegate <сигнатура>

  • Сигнатура это

    • тип возвращаемого значения

    • последовательность типов передаваемых параметров

  • Например: int Func (int a, float b) { … }

  • Тип delegate поддерживает три важных элемента информации:

    • Адрес метода на который он ссылается.

    • Параметры (если они есть) данного метода.

    • Возвращаемое методом значение.

  • Для описания типа делегата нужно указать ключевое слово delegate после которого задать сигнатуру, которой он должен соответствовать:

<режим доступа> delegate <тип> <имя типа> (формальные параметры);

    • Например создаем новый тип MyFunc:

public delegate int MyFunc(int n, int m);

  • После того, как тип delegate описан можно создавать экземпляры данного типа (переменные):

MyFunc f1;

  • Этим переменным можно присваивать ссылки на методы с заданной сигнатурой:

f1 = new MyFunc(Sum); // для метода Sum(int x, int y);

  • После задания ссылки на метод этот метод можно вызывать с помощью переменной delegate с помощью операции ().

int n = f1(5,4);

Использование делегатов

  • Объявление нового типа ссылок с помощью типа delegate:

<режим доступа> delegate <тип> <имя типа> (формальные параметры);

      • Например: public delegate int MyFunc(int n);

  • Создание экземпляра нового типа ссылок

<имя типа> <имя переменной> = new <имя типа> (имя функции);

      • Например:

int myFunction(int k) { return (2*k);} . . . f = new MyFunc (myFunction);

  • Использование экземпляра делегата (вызов методов, ссылки на которые сохранены)

    • задание ссылки:

<имя переменной> = new <имя типа> (<имя метода>);

<имя переменной> = <имя метода>;

    • вызов методов

<имя переменной>(фактические параметры);

Например: int n = f(5);

Будут вызываться последовательно все методы, ссылки на которые сохранены

  1. События классов. Описание событий в классе и их использование в классах пользователях.

События это:

Сообщение объекта своему пользователю о том, что произошло что-то важное.

Например:

  • Выполнена какая-то часть работы

  • Произошла ошибка

  • Пользователь выполнил некоторые действия (переместил мышь, сделал щелчок, нажал клавишу)

Вся работа программ с среде ОС Windows основана на событиях

Программирование основанное на событиях – event driven programming.

Работа с событиями в C#

  • С помощью делегатов в классах можно описывать события.

  • События это способ взаимодействия между объектами разных классов.

    • Объекты одного класса могут использовать объекты других классов.

    • Для этого они создают объекты требуемого класса и вызывают его методы (передают ему сообщения).

    • При работе вызванных методов часто возникает необходимость передать сообщения о возникших ситуациях (важных изменения в своей работе) объектам вызывающего класса, без завершения их работы.

    • Для передачи таких сообщений и используются специальные элементы класса – события.

Объявление события в классе

  • Вначале объявляется делегат, как это рассматривалось ранее. Объявление делегата описывается в некотором классе. Но, часто, это объявление находится вне класса в пространстве имен.

public delegate <тип> <имя_делегата> ([параметры]);

    • Например:

public delegate void MyHandler (object o, int n);

  • Объявить событие как экземпляр соответствующего делегата. При этом используется ключевое слово event (это гарантирует, что экземпляр события не может быть вызван в других классах).

рublic event <имя_делегата> <имя_события>;

    • Например:

public event MyHandler MyEvent;

  • Для инициирования события требуется просто вызвать на выполнение экземпляр делегата.

    • Например:

if (MyEvent != null) // проверка, что для события заданы обработчики

MyEvent(this, i); // если есть обработчики, то запускаем событие

Обработка событий в классах

В классе, который будет обрабатывать событие, нужно:

  1. описать метод - обработчик события, который имеет такую же сигнатуру, как у делегата, который задает событие;

  2. в одном из методов создать объект, имеющий событие;

  3. присвоить ссылку на метод – обработчик события – открытой переменной объекта (событию) с использованием операции +=.

Пример обработки события

class Program {

const int WorkVolume = 10000000; // объем работы

// обработчик события

private static void ShowStar(object o, int n)

{ Console.WriteLine(" Выполнено {0}%", n);

//Console.Write("*"); // можно просто выводить * }

public static void Main()

{ // создается объект

ClassWithEvent obj=new ClassWithEvent(WorkVolume);

// событию задается обработчик

obj.MyEvent += new MyHandler(ShowStar);

// запускам метод объекта у которого возникает данное событие

obj.LongWork();

// ждем нажатия клавиши

Console.ReadLine(); }

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]