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

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

 


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