Автор: Ломова Любовь Андреевна
Должность: преподаватель
Учебное заведение: Филиал ФГБОУ ВО "Мурманский арктический государственный университет"
Населённый пункт: г. Кировск, Мурманская обл.
Наименование материала: Методическая разработка урока по МДК "Прикладное программирование" для специальности 09.02.03
Тема: Делегаты
Раздел: среднее профессиональное
МДК 01.02 Прикладное
программирование
Тема 2.2. Разработка кода программного
продукта на уровне модуля
Ломова Л.А.
Терминология
Делегат –
особый вид класса, хранящий ссылки на методы.
Делегат –
это тип, который представляет собой ссылки на методы с
определенным списком параметров и возвращаемым типом.
Все
делегаты являются объектами
типа
System.Delegate или
System.MulticastDelegate.
Делегаты
Синтаксис:
[cпецификаторы]
delegate тип_возвращаемого_значения
имя([параметры])
, где
delegate –
ключевое слово;
тип возвращаемого значения
– тот тип, который будет возвращать функция,
на которую ссылается делегат;
параметры
– необязательные параметры,
которые будут присутствовать у
функции, на которую ссылается делегат.
!
Делегат может служить для вызова любого метода с соответствующей
сигнатурой и возвращаемым типом.
Алгоритм работы с делегатом
1. Объявление делегата.
2. Определение метода, «подходящего» для работы с делегатом
3. В основной программе создание экземпляра делегата и связь его с
определённой функцией (методом);
4. Вызов метода через делегат.
Пример #1
Ситуация: находясь в аэропорту, вы вдруг услышали сигнал
пожарной сигнализации (это событие).
Варианты развития событий:
1.
Бежать к ближайшему аварийному выходу.
2.
Если, ДО сигнализации вы услышали объявление о посадке на
свой самолет, то с посадочным талоном быстро направитесь
ко входу в терминал (билеты уже куплены, а вы очень хотите
на море).
3.
Если по громкой связи объявят о том, что вас ищет
родственник/друг, приехавший вас проводить, то сначала вы
пойдете к столу справок, чтобы покинуть зал вместе.
Применение делегатов
для обычной функции без класса
Применение делегатов
Вызов делегата
делегат
переменная =
new делегат
(объект.метод);
объект.метод
–
это либо статический метод класса,либо метод
экземпляра класса.
Этот метод должен совпадать по числу и типу
параметров с типом делегата,а также по типу возвращаемого
значения.
Примеры:
Использование делегатов:
Делегат для выбора методов делегирования
(программист не знает,
какой метод ему понадобится и задаёт или определяет его во время
выполнения программы);
Делегат
–
оповещатель наблюдателя
(паттерн «наблюдатель»);
Делегат, как обратный вызов метода
;
Делегат, как обработчик событий.
Делегаты
Делегаты используются для получения возможности определять вызываемый
метод не при компиляции, а
во время выполнения программы (динамически)
,
т.е.
делегат может связыватьсяне с
одним методом,
а с
несколькими
(экземпляры делегата могут содержать несколько ссылок на методы).
Можно подсоединять к одному делегату несколько методов,
каждый из которых при
единственном обращении к делегату будет вызваться по цепочке.
Таким образом,из
программы будет виден лишь один делегат, за которым скрывается несколько методов.
Недостатки механизма вызова функций,
связанных с делегатом
Они связаны со случаем,когда в списке вызова делегата присутствует
более одной функции:
Функции, на которые ссылаются делегаты, могут возвращать значения,
но их значения не получить,т.к. штатная функция вызова возвращает
значение, которая вернула последняя из опрошенных функций.
При обращении к делегату,содержащему в списке вызова несколько
функций,не гарантируется,
что все функции из списка будут вызваны.
Если одна из них сгенерирует исключение,
то работа штатной функции
вызова будет прервана и остальные функции вызваны не будут.
Самостоятельно:
1. Написать код,складывающий между собой два целых числа
(функция). Использовать делегат.
2. Написатьфункцию,
вычисляющую минимум функции на
отрезке [a, b]: F(x) = a*x
2
(a, x – вещественные). Использовать
делегат.
Использование делегата для работы с
несколькими методами
Исходная функция
Что делает эта
функция?
Что делает эта
функция?
Как надо переписать
код, чтобы
использовался делегат?
Как надо переписать
код, чтобы
использовался делегат?
Использование делегата для работы с
несколькими методами
Проверить
работоспособность
кода
Проверить
работоспособность
кода
Перебор всех
функции делегата
Перебор всех
функции делегата
Multicast-делегаты
Многоадресными (Multicast)
называются делегаты, сочетающие в себе
несколько методов одновременно.
Особенности:
вызывается сразу несколько методов;
все методы вызываются по принципу
FIFO (First In First
Out)
–
«первым вызван – первым сработает»;
операторы + и += используются, чтобы добавить очередной метод к
делегату;
операторы -
и
-= используются, чтобы удалить
лишний,
уже
ненужный метод из списка.
Комментарий к примеру:
Еще один способ вызова делегата – метод
Invoke()
.
Пример: mydel.Invoke(“строка”);
Если делегат принимает параметры, то в метод Invoke
передаются значения для этих параметров.
Если делегат пуст (в его списке вызова нет ссылок ни на один
из методов → делегат равен Null),
то при вызове такого
делегата будетсоздано исключение. Поэтому при вызове
делегата стоит проверять,
не равен ли он null,
либо можно
использовать метод Invoke и оператор условного null.
Пример: mydel
?
.Invoke(“строка”);
Самостоятельно:
3.
Создать функции MyFunc1,
MyFunc2,ничего не возвращающие,
но работающие со строковым параметром. Использовать делегат
для вызова обеих функций.
Дополнение:для проверки работы функций используйте команду
вывода на экран фразы «Вызвана функция № …».
4.
Написать функцию, вычисляющую минимум функции на отрезке
[a, b]:
F1(x) = a*x
2
(a, x – вещественные);
F2(x) = a * sin(x). Использовать делегат для вызова обеих функций.
События
Событие в ООП
— это
сообщение, которое возникает в различных точках
исполняемого
кода
при
выполнении
определённых
условий
(по
сути,
сообщает об
изменении
состояния некоторого объекта).
Предназначены для того,
чтобы иметь
возможность предусмотреть
реакцию программного обеспечения.
В C# делегаты образуют основные строительные блоки для событий.
События
Событие
– это особый тип делегата,
который облегчаетсобытийно-
ориентированное программирование.События — это члены класса,
которые нельзя вызывать вне класса независимо от спецификатора
доступа.
Например, событие, объявленное как public,
позволило бы другим
классам использовать += и -= для этого события,
но запуск события (то
есть вызов делегата) разрешен только в классе, содержащем событие.
В чем схожесть
событий и
делегатов? Как
выбрать подходящий
механизм?
Домашнее задание
1.
Что такое ковариантность и контравариантность в C#?
Приведите примеры.
2.
Что такое лямбда-выражение? Приведите примеры.
Благодарю за внимание!