C #. Делегати. Програма розрахунку характеристик фігур

  1. зміст

Даний приклад демонструє використання делегатів мови 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.

Рис. 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.

Рис. 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.

Рис. 3. Виконання програми

пов'язані теми