C #. Делегати. Оголошення делегата. приклади коду
зміст 1. Для чого використовуються делегати?
Делегат - це об'єкт, який може посилатися на метод. Фактично, делегат инкапсулирует метод. Після створення делегата, виходить об'єкт, який містить посилання на метод. За допомогою делегата можна викликати метод, на який цей делегат посилається.
Рис. 1. Призначення делегата
⇑
2. Яка загальна форма оголошення типу делегата? Для чого використовується ключове слово delegate?
Щоб отримати делегат, спочатку потрібно оголосити його тип. Тип делегата оголошується за допомогою ключового слова delegate. Нижче наведена загальна форма оголошення делегата:
delegate возвращаемий_тіп ім'я (спісок_параметров);
де
- возвращаемий_тіп - позначає тип значення, яке повертається методами, які будуть викликатися за допомогою делегата;
- ім'я - безпосереднє ім'я типу делегата. За допомогою цього імені оголошуються делегати таким самим чином як оголошуються звичайні змінні;
- спісок_параметров - параметри, які необхідні для методів, які будуть викликатися за допомогою делегата.
⇑
3. Яка загальна форма оголошення делегата?
Після оголошення типу делегата можна оголошувати сам делегат. Загальна форма оголошення делегата (об'єкта) точно така ж, як у випадку оголошення змінної деякого типу:
тіп_делегатаімя1[, імя2, ...];
де
- тіп_делегата - назва типу делегата, який оголошується за допомогою ключового слова delegate (див. п. 2);
- імя1, імя2, ... - імена делегатів (змінних типу «делегат», об'єктів, і т.п.). За допомогою цих імен можна мати доступ до методів, на які посилаються делегати.
⇑
4. Чи можна за допомогою делегата викликати різні методи?
Так. Делегат може викликати різні методи. Якщо делегат посилається на метод1, то щоб викликати метод2 за допомогою делегата, потрібно в цьому делегата змінити посилання на цей метод (метод2).
Рис. 2. Делегат посилається на Метод2
⇑
5. Найпростіший приклад оголошення делегата і його використання в програмі
Даний приклад розглядається для додатків, які створені за шаблоном Windows Forms Application.
Приклад створення програми типу Windows Forms Application докладно описується в темі:
Практична реалізація даного прикладу докладно описується в статті:
⇑
5.1. Умова задачі
У додатку типу Windows Forms Application оголосити тип делегата, який посилається на метод. Вимоги до сигнатурі методу наступні:
- метод отримує вхідним параметром змінну типу double;
- метод повертає значення типу double, яке є результатом обчислення.
Реалізувати виклик методів за допомогою делегата, які отримують радіус R і обчислюють:
- довжину окружності по формулі D = 2 · π · R;
- площа кола по формулі S = π · R2;
- об'єм кулі. Формула: V = 4/3 * π · R3.
Методи повинні бути оголошені як статичні (з використанням ключового слова static).
⇑
5.2. роздуми
Для роботи програми вибираємо такі імена:
- назва типу делегата - CalcFigure;
- назва делегата (примірника об'єкта) - CF;
- назва методу, який обчислює довжину кола - Get_Length ();
- назва методу, який обчислює площу круга - Get_Area ();
- назва методу, який обчислює об'єм кулі - Get_Volume ().
Оголошення типу делегата і методів здійснюється в класі Form1 головної форми додатка типу Windows Forms Application.
⇑
5.3. Рішення (фрагменти коду)
5.3.1. Оголошення типу делегата
Тип делегата оголошується в деякому класі. Це може бути, наприклад, клас основної форми в разі, якщо програма створена за шаблоном Windows Forms Application.
У класі потрібно оголосити тип делегата з ім'ям CalcFigure відповідно до умовою завдання. Фрагмент такого оголошення наведено нижче:
// оголошення типу делегата CalcFigure delegate double CalcFigure (double r);
⇑
5.3.2. Оголошення методів в класі
Методи в класі оголошуються як статичні з ключовим словом static.
// оголошення статичних методів в класі // довжина кола public static double Get_Length (double r) {double length; length = 2 * 3.1415 * r; return length; } // площа кола public static double Get_Area (double r) {double area; area = 3.1415 * r * r; return area; } // об'єм кулі public static double Get_Volume (double r) {double volume; volume = 3.1415 * r * r * r * 4.0 / 3.0; return volume; }
⇑
5.3.3. Демонстрація виклику методів за допомогою делегата
Демонстрація виклику методів за допомогою делегата з іншого програмного коду, наприклад з обробника події кліка на кнопці (шаблон Windows Forms Application).
// обробник події button1_Click () private void button1_Click (object sender, EventArgs e) {double radius, length, area, volume; radius = Convert .ToDouble (textBox1.Text); // виклик делегата // сконструювати делегат CalcFigure CF = new CalcFigure (Get_Length); length = CF (radius); // 1. Виклик методу Get_Length () CF = new CalcFigure (Get_Area); area = CF (radius); // 2. Виклик методу Get_Area () CF = new CalcFigure (Get_Volume); volume = CF (radius); // 3. Виклик методу Get_Volume () label2.Text = length.ToString (); label3.Text = area.ToString (); label4.Text = volume.ToString (); }
На малюнку 3 схематично зображено робота делегата CF.
Рис. 3. Делегат CF
⇑
6. Як здійснюється групове перетворення делегованих методів? приклад
Групове перетворення делегованих методів дозволяє спростити рядок присвоєння делегату методу. У цьому випадку ключове слово new опускається.
У наведеному вище прикладі (див. П. 5) рядок
CF = new CalcFigure (Get_Length);
можна замінити рядком
CF = Get_Length;
що спрощує програмний код і наочність його відображення.
З огляду на вищесказане, відповідний обробник події button1_Click () може мати такий вигляд:
// групове перетворення делегатів private void button1_Click (object sender, EventArgs e) {double radius, length, area, volume; radius = Convert .ToDouble (textBox1.Text); // заміна оператора new на оператор присвоювання // сконструювати делегат з ім'ям CF CalcFigure CF = Get_Length; // не потрібно оператора new - спрощення коду length = CF (radius); // Виклик методу Get_Length () CF = Get_Area; // делегат CF посилається на Get_Area area = CF (radius); // Виклик методу Get_Area () CF = Get_Volume; // делегат CF посилається на Get_Volume volume = CF (radius); // Виклик методу Get_Volume () label2.Text = length.ToString (); label3.Text = area.ToString (); label4.Text = volume.ToString (); }
⇑
пов'язані теми
⇑
1. Для чого використовуються делегати?1. Для чого використовуються делегати?
2. Яка загальна форма оголошення типу делегата?
Для чого використовується ключове слово delegate?
3. Яка загальна форма оголошення делегата?
4. Чи можна за допомогою делегата викликати різні методи?
6. Як здійснюється групове перетворення делегованих методів?