Составители Чеботарев А.В., Папок О.В

Лабораторная работа № 12.1

Тема:Разработка программ реализующих механизм позднего связывания функций при помощи делегатов.

Цель работы: Формирование умений и навыков использования делегатов в программе.

Время на выполнение работы: 2 часа

Этапы работы:

I.Ознакомится с теоретическими сведениями

II.Выполнить задания.

III.Ответить на контрольные вопросы

I Теоретические сведения

Основы программирования на C#

Делегаты

Делегат — это объект, имеющий ссылку на метод. Делегат позволяет выбрать вызываемый метод во время выполнения программы. Фактически значение делегата – это адрес области памяти, где находится точка входа метода.

Важным свойством делегата является то, что он позволяет указать в коде программы вызов метода, но фактически вызываемый метод определяется во время работы программы, а не во время компилирования.

Делегат объявляется с помощью ключевого слова delegate, за которым указывается тип возвращаемого значения, имя делегата и список параметров вызываемых методов.

Синтаксис:

delegateтип_возвращаемого_значения имя_делегата(список_параметров);

Xарактерной особенностью делегата является возможность его использования для вызова любого метода, который соответствует подписи делегата. Это дает возможность определить во время выполнения программы, какой из методов должен быть вызван. Вызываемый метод может быть методом экземпляра, ассоциированным с объектом, либо статическим методом, ассоциированным с классом. Метод можно вызвать только тогда, когда его подпись соответствует подписи делегата.

Многоадресность делегатов

Многоадресность — это способность делегата хранить несколько ссылок на различные методы, что позволяет при вызове делегата инициировать эту цепочку методов.

Для создания цепочки методов необходимо создать экземпляр делегата, и пользуясь операторами + или += добавлять методы к цепочке. Для удаления метода из цепочки используется оператор - или -=. Делегаты, хранящие несколько ссылок, должны иметь тип возвращаемого значения void.

Пример:

// Создадим делегат

delegate int IntOperation (int i, int j);

Static class Calculator

{

// Организуем ряд методов

Static int Sum(int x, int y)

{

return x + y;

}

Static int Prz(int x, int y)

{

return x * y;

}

Static int Del(int x, int y)

{

return x / y;

}

}

Class Program

{

Static void Main()

{

// Сконструируем делегат

IntOperation op1 = new IntOperation(Sum);

int result = op1(5, 10);

Console.WriteLine("Сумма: " + result);

// Изменим ссылку на метод

op1 = new IntOperation(Prz);

result = op1(5, 10);

Console.WriteLine("Произведение: " + result);

Console.ReadLine();

}

}

II Задание

Общее задание:

Создать меню(в примере его нет) для выбора операции. Операция должна при помощи делегатов подключаться динамически на этапе выполнения.

Варианты:

1. Создать класс телевизор с методами:

· Показать веселый смайлик

· Показать грустный смайлик

· Показать задумчивый смайлик.

Обязательно чтобы он был в телевизоре на консоле.

2. Создать класс агрегатор со следующими возможностями:

· Посчитать среднее арифметическое любого количества чисел

· Посчитать среднее геометрическое любого количества чисел

3. Создать класс матрица(ступенчатый массив) со следующими возможностями:

· Посчитать диагональную сумму чисел

· Посчитать седловую точку (максимум в столбце, минимум в строке)

· Посчитать среднее арифметическое всей матрицы чисел

4. Создать класс матрица(ступенчатый массив) со следующими возможностями:

· Посчитать диагональную сумму чисел

· Посчитать седловую точку (максимум в столбце, минимум в строке)

· Посчитать среднее арифметическое всей матрицы чисел

5. Создать класс агрегатор со следующими возможностями:

· Посчитать сумму любого количества чисел

· Посчитать произведение любого количества чисел

· Найти максимальное среди любого количества чисел

6. Создать класс агрегатор со следующими возможностями:

· Посчитать среднее арифметическое любого количества чисел

· Посчитать количества переданных в метод чисел

· Найти минимальное среди любого количества чисел

7. Создать класс архитектор со следующими возможностями:

· Нарисовать домик в анфас на заданное количество точечек

· Нарисовать домик в профиль на заданное количество точечек

8. Создать класс обработчик матриц со следующими возможностями:

· Отсортировать строки любой матрица типа int[][] так, чтобы вначале были те у которых сумма всех элементов строки меньше.

· Отсортировать строки любой матрица типа int[][] так, чтобы вначале были те у которых произведение всех элементов строки меньше.

Обязательно матрица передается в методы в качестве параметра(и меняется в нем!)

III. Контрольные вопросы

1. Что понимается под термином «делегат»?

2. В чем состоят преимущества использования делегатов?

3. В какой момент осуществляется выбор вызываемого метода в случае использования делегатов?

4. Что является значением делегата?

5. Какое ключевое слово языка C# используется для описания делегатов?

6. Приведите синтаксис делегата в общем виде. Проиллюстрируйте его фрагментом программы на языке C#.

7. Возможно ли использование делегата для вызова метода, соответствующего подписи делегата?

8. Возможен ли вызов метода в том случае, если его подпись не соответствует подписи делегата?

9. Что понимается под термином «многоадресность»?

10. В чем состоит практическое значение многоадресности?

11. Каким образом осуществляется создание цепочки методов для многоадресных делегатов?

12. Какие операторы языка C# используются для создания цепочки методов для многоадресных делегатов?

13. Каким образом осуществляется удаление цепочки методов для многоадресных делегатов?

14. Какие операторы языка C# используются для удаления цепочки методов для многоадресных делегатов?

15. Каким должен быть тип возвращаемого значения для многоадресных делегатов?

Литература

1. Полный справочник по С#. Г. Шилдт. Издательский дом «Вильямс», 2004.

2. С# в подлиннике. Наиболее полное руководство. Х.Дейтел.

3. C# в задачах и примерах. Культин. Н.Б.

4. С# учебный курс. Г.Шилдт. СПб.: Питер, 2002.

5. С# программирование на языке высокого уровня Павловская Т.А. СПб.: БХВ-Петербург.

Составители Чеботарев А.В., Папок О.В.

Наши рекомендации