Часть 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(); }
Как видно из програмного кода, обязательно нужно создать экземпляр объекта класса, чтобы использовать методы этого класса в программе.
⇑
Связанные темы
- Понятие делегата. Объявление типа делегата. Использование делегата в программе. Групповое преобразование методов
- Пример решения задачи, вычисляющей характеристики геометрических фигур с использованием делегатов
- Делегаты. Групповая адресация. Создание цепочек вызовов методов
- Анонимные функции. Анонимные методы. Возврат значения. Передача параметров
- Примеры передачи массивов, структур, классов анонимному методу
- События и делегаты. Понятие события. Взаимодействие между событиями. Примеры использования событий