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




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

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

  ⇑


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

  ⇑