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();
}

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

  ⇑


Связанные темы

  ⇑