Пример решения задачи, вычисляющей характеристики геометрических фигур с использованием делегатов

Пример решения задачи, вычисляющей характеристики геометрических фигур с использованием делегатов

Данный пример демонстрирует использование делегатов языка C# для решения задачи, в которой вычисляются характеристики геометрических фигур. Пример предназначен исключительно для изучения работы делегатов.


Содержание



Условие задачи

В приложении типа Windows Forms Application объявить тип делегата, который ссылается на метод. Требования к сигнатуре метода следующие:

  • метод получает входным параметром переменную типа double;
  • метод возвращает значение типа double, которое есть результатом вычисления.

Реализовать вызов методов с помощью делегата, которые получают радиус R и вычисляют:

  • длину окружности по формуле D = 2 * π* R;
  • площадь круга по формуле S = π* R²;
  • объем шара. Формула V = 4/3 * π * R³.

Методы должны быть объявлены как статические (с ключевым словом static).

 

Соображения

Для работы программы выбираем следующие имена:

  • название типа делегата – CalcFigure;
  • название делегата (объекту) – CF;
  • название метода, который вычисляет длину окружности – Get_Length();
  • название метода, который вычисляет площадь круга – Get_Area();
  • название метода, который вычисляет объем шара – Get_Volume().

Объявление типа делегата и методов осуществляется в классе Form1 главной формы приложения типа Windows Forms Application.

 

Выполнение

1. Запустить Microsoft Visual Studio. Создать проект (приложение) по шаблону Windows Forms Application

Создать проект по шаблону Windows Forms Application. Имя модуля главной формы «Form1.cs». Имя проекта можно задать, например, «Delegates01». Имя экземпляра объекта формы приложения Form1.

Пример создания проекта по шаблону Windows Forms Application подробно описывается в теме:

Окно новосозданной формы приложения изображено на рисунке 1.

C#. Windows Forms Application. Главная форма Form1

Рис. 1. Окно главной формы приложения Form1

После создания проекта текст модуля основной формы приложения следующий:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Delegates01
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    }
}

 

2. Разработка формы приложения

Разместить на форме приложения следующие элементы управления:

  • четыре элемента управления типа Label. В результате будет создано 4 экземпляра (объекта) класса Label с именами label1, label2, label3, label4;
  • элемент управления типа TextBox с именем textBox1;
  • элемент управления типа Button с именем button1.

С помощью окна Properties настроить следующие свойства элементов управления:

  • в элементе управления label1 свойство Text = «R = « (label1.Text = «R = «);
  • label2.Text = «Длина окружности = «;
  • label3.Text = «Площадь круга = «;
  • label4.Text = «Объем шара = «;
  • в элементе управления Form1 (главная форма) свойство Text = «Расчет»;
  • в Form1 свойство StartPosition = CenterScreen;
  • в элементе управления button1 свойство Text = «Вычислить».

После выполненных действий, форма приложения будет иметь вид как изображено на рисунке 2.

C#. Windows Forms Application. Делегаты. Форма приложения после настройки

Рис. 2. Форма приложения после настройки и размещения элементов управления

 

3. Написание программного кода

3.1. Объявление типа делегата

В соответствии с соображениями, тип делегата носит имя CalcFigure и объявляется в классе Form1 (файл «Form1.cs») перед конструктором формы Form1(). Текст объявления делегата следующий:

// объявление типа делегата CalcFigure
delegate double CalcFigure(double r);

При объявлении типа делегата используется ключевое слово delegate.

 

3.2. Объявление методов вычисления характеристик геометрических фигур

Методы объявляются в классе формы после реализации конструктора формы Form1(). В соответствии с условием задачи, методы в классе объявляются как статические с ключевым словом static.

После объявления методов текст модуля «Form1.cs» имеет вид:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Delegates01
{
    public partial class Form1 : Form
    {
        // объявление типа делегата CalcFigure
        delegate double CalcFigure(double r);

        public Form1()
        {
            InitializeComponent();
        }

        // объявление статических методов в классе
        // длина окружности
        public static double Get_Length(double r)
        {
            double length;
            length = 2 * 3.1415 * r;
            return length;
        }

        // площадь круга
        public static double Get_Area(double r)
        {
            double area;
            area = 3.1415 * r * r;
            return area;
        }

        // объем шара
        public static double Get_Volume(double r)
        {
            double volume;
            volume = 3.1415 * r * r * r * 4.0 / 3.0;
            return volume;
        }
    }
}

 

3.3. Программирование события Click, которое вызывается при клике на кнопке button1 (вариант 1)

Следующий шаг – программирование события клика на кнопке «Вычислить» (элемент управления button1).

Текст обработчика события клика на кнопке button1 следующий:

private void button1_Click(object sender, EventArgs e)
{
    double radius, length, area, volume;

    // считать радиус
    radius = Convert.ToDouble(textBox1.Text);

    // вызов делегата
    // сконструировать делегат
    CalcFigure CF = new CalcFigure(Get_Length);

    length = CF(radius); // 1. Вызов метода Get_Length()

    CF = new CalcFigure(Get_Area);
    area = CF(radius); // 2. Вызов метода Get_Area()

    CF = new CalcFigure(Get_Volume);
    volume = CF(radius); // 3. Вызов метода Get_Volume()

    // вывод результатов на форму
    label2.Text = "Длина окружности = " + length.ToString();
    label3.Text = "Площадь круга = " + area.ToString();
    label4.Text = "Объем шара = " + volume.ToString();
}

Объясним некоторые фрагменты кода.

Радиус окружности считывается во внутреннюю переменную radius. Преобразование из строки в текст осуществляется с помощью класса Convert (метод ToDouble()).
Следующим шагом строится делегат с именем CF. Этот делегат инициализируется значением Get_Length. Это означает, что делегат ссылается на метод Get_Length().

На следующих шагах происходит переопределение делегата CF соответственно методами Get_Area() и Get_Volume().
Следующий пункт отображает другой вариант реализации обработчика события.

 

3.4. Программирование события Click, которое вызывается при клике на кнопке button1 (вариант 2)

Обработчик события клика на кнопке button1 может иметь и другую реализацию, которая есть более наглядной и упрощенной.

private void button1_Click(object sender, EventArgs e)
{
    double radius, length, area, volume;

    // взять радиус
    radius = Convert.ToDouble(textBox1.Text);

    // вызов делегата
    // сконструировать делегат
    CalcFigure CF = Get_Length;

    length = CF(radius); // 1. Вызов метода Get_Length()

    CF = Get_Area;
    area = CF(radius); // 2. Вызов метода Get_Area()

    CF = Get_Volume;
    volume = CF(radius); // 3. Вызов метода Get_Volume()

    // вывод результата на форму
    label2.Text = "Длина окружности = " + length.ToString();
    label3.Text = "Площадь круга = " + area.ToString();
    label4.Text = "Объем шара = " + volume.ToString();
}

В этом случае происходит так называемое групповое преобразование делегированных методов. При таком преобразовании ключевое слово new опускается. Программный код упрощается.

 

3.5. Текст модуля Form1.cs

Текст всего модуля Form1.cs решения данной задачи (вариант 2) имеет вид:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Delegates01
{
    public partial class Form1 : Form
    {
        // объявление типа делегата CalcFigure
        delegate double CalcFigure(double r);

        public Form1()
        {
            InitializeComponent();
        }

        // объявление статических методов в классе
        // длина окружности
        public static double Get_Length(double r)
        {
            double length;
            length = 2 * 3.1415 * r;
            return length;
        }

        // площадь круга
        public static double Get_Area(double r)
        {
            double area;
            area = 3.1415 * r * r;
            return area;
        }

        // объем шара
        public static double Get_Volume(double r)
        {
            double volume;
            volume = 3.1415 * r * r * r * 4.0 / 3.0;
            return volume;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            double radius, length, area, volume;

            // взять радиус
            radius = Convert.ToDouble(textBox1.Text);

            // вызов делегата
            // сконструировать делегат
            CalcFigure CF = Get_Length;
            length = CF(radius); // 1. Вызов метода Get_Length()

            CF = Get_Area;
            area = CF(radius); // 2. Вызов метода Get_Area()

            CF = Get_Volume;
            volume = CF(radius); // 3. Вызов метода Get_Volume()

            // вывод результата на форму
            label2.Text = "Длина окружности = " + length.ToString();
            label3.Text = "Площадь круга = " + area.ToString();
            label4.Text = "Объем шара = " + volume.ToString();
        }
    }
}

 

4. Запуск программы на выполнение

Окно программы после запуска изображено на рисунке 3.

C#. Windows Forms шаблон. Делегаты. Выполнение программы

Рис. 3. Выполнение программы

 


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