Використання делегатів, які посилаються на методи екземпляру класу. Приклад

Частина 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();
}

Як видно з програмного коду, обов’язково потрібно створювати екземпляр об’єкту класу, щоб використати методи цього класу в програмі.

 


Зв’язані теми