Частина 2. Використання делегатів, які посилаються на методи екземпляру класу. Приклад
Дана тема базується на темі:
Зміст
- Питання/відповідь
- Зв’язані теми
Пошук на інших ресурсах:
1. Які кроки потрібно виконати, щоб делегати посилались на методи екземпляру об’єкту деякого класу?
Якщо методи оголошені в класі як нестатичні (без ключового слова static), тоді потрібно створювати екземпляр об’єкту класу. Це означає, що потрібно виділяти пам’ять для об’єкту (екземпляру) класу (і його методів) з допомогою оператора new.
Якщо методи, на які має посилатись делегат, описані в класі з іменем X, тоді послідовність кроків наступна:
- 1. Оголосити тип делегату за межами класу X.
- 2. У потрібному програмному коді (наприклад, обробнику події):
- створити екземпляр об’єкту класу X стандартним способом (з допомогою оператора new);
- ініціалізувати делегат стандартним способом (присвоїти делегату метод зі створеного екземпляру класу);
- викликати метод класу з допомогою делегату.
⇑
2. Приклад використання делегату, який посилається на методи екземпляру класу
Даний приклад розглядається для додатків, що створені за шаблоном Windows Forms Application. Приклад створення додатку типу Windows Forms Application детально описується в темі:
2.1. Умова задачі
Для додатку типу Windows Forms Application оголосити тип делегату, що посилається на метод. Вимоги до сигнатури методу наступні:
- метод отримує вхідним параметром змінну типу double;
- метод повертає значення типу double, яке є результатом обчислення згідно з умовою задачі.
Реалізувати виклик трьох методів з допомогою делегату, які отримують радіус кола R в якості вхідного параметру і обчислюють:
- довжину кола за формулою D = 2 · π · R;
- площу круга за формулою S = π · R2;
- об‘єм кулі. Формула V = 4/3 · π · R3.
Методи повинні бути представлені в окремому класі як нестатичні (без ключового слова static). Бажано, щоб клас був оголошений в окремому модулі (файлі).
⇑
2.2. Міркування
Для роботи програми вибираємо такі імена:
- назва типу делегату – CalcFigures;
- назва делегату (об‘єкту) – CF;
- назва класу – Figures;
- назва файлу, в якому оголошується клас – “Figures.cs”;
- назва методу, що обчислює довжину кола – Get_Length();
- назва методу, що обчислює площу круга – Get_Area();
- назва методу, що обчислює об‘єм кулі – Get_Volume().
⇑
2.3. Розв‘язок (фрагменти коду)
2.3.1. Оголошення типу делегату
Тип делегату оголошується у класі, в якому розміщується метод демонстрації делегату (наприклад, обробник події в додатках типу Windows Forms Application). У випадку з додатком Windows Forms Application основним є клас головної форми Form1. У тілі цього класу потрібно оголошувати делегат. Приблизний код тексту модуля Form1.cs має такий вигляд:
namespace TrainDelegates02 { public partial class Form1 : Form { // Оголошення типу делегату. Тип називається CalcFigures delegate double CalcFigures(double r); public Form1() { InitializeComponent(); } ... } }
⇑
2.3.2. Опис (оголошення) класу, який розміщується в окремому модулі “Figures.cs”
У системі Microsoft Visual Studio оголошувати клас можна в окремому модулі. Для забезпечення зручності розробки додатків рекомендовано розміщувати клас в окремому модулі (наприклад Figures.cs).
Вихідний код класу наступний:
// клас, розміщується в окремому модулі Figures.cs class Figures { // оголошення методів класу // методи оголошуються без ключового слова static // довжина кола public double Get_Length(double r) { double length; length = 3.1415 * 2 * r; return length; } // площа круга public double Get_Area(double r) { double area; area = 3.1415 * r * r; return area; } // об'єм кулі public double Get_Volume(double r) { double volume; volume = 4.0 / 3.0 * 3.1415 * r * r * r; return volume; } }
⇑
2.3.3. Виклик методів з допомогою делегату
Демонстрація виклику методів з допомогою делегату з іншого програмного коду, наприклад, з обробника події кліку на кнопці (шаблон Windows Forms Application).
// клік на кнопці "Обчислити" private void button1_Click(object sender, EventArgs e) { // демонстрація роботи з методами, що є екземплярами класу // оголошення змінних double radius; double length, area, volume; // оголошення екземпляру класу (якщо методи статичні, то цього не потрібно робити) Figures FG; // FG - змінна (об'єкт) типу "клас Figures" FG = new Figures(); // створити екземпляр об'єкту класу // оголошення делегату з іменем CF типу CalcFigures CalcFigures CF; // взяти радіус radius = Convert.ToDouble(textBox1.Text); // обчислити значення довжини кола CF = FG.Get_Length; // ініціалізувати делегат значенням методу, що обчислює довжину кола length = CF(radius); // вивести на форму результат довжини кола label2.Text = length.ToString(); // обчислити значення площі круга CF = FG.Get_Area; // присвоїти делегату метод Get_Area area = CF(radius); label3.Text = area.ToString(); // обчислити значення об'єму кулі CF = FG.Get_Volume; // присвоїти делегату метод Get_Volume volume = CF(radius); // виклик методу Get_Volume label4.Text = volume.ToString(); }
Як видно з програмного коду, обов’язково потрібно створювати екземпляр об’єкту класу, щоб використати методи цього класу в програмі.
⇑
Зв’язані теми
- Поняття делегату. Оголошення типу делегату. Використання делегатів у програмі. Групове перетворення методів
- Приклад розв’язку задачі, що обчислює характеристики геометричних фігур з використанням делегатів
- Делегати. Групова адресація. Створення списків викликів методів
- Анонімні функції. Анонімні методи. Повернення значення. Передача параметрів
- Приклади передачі масивів, структур, класів анонімному методу
- Події і делегати. Поняття події. Взаємодія між подіями. Приклади використання подій