Пример использования делегата

Для лучшего понимания механизма работы делегата рассмотрим решение следующей задачи: разработать приложение для вычисления пяти функций вещественного типа, имеющих вещественный аргумент: Sin(x), Log(x), Cos(x), Exp(x) и Round(x). Для выбора вычисляемой функции использовать делегат.

Исходный код программы:

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 WindowsFormsApplication1

{

public partial class Form1: Form

{

public Form1()

{

InitializeComponent();

}

public delegate double Funk(double x);//Объявление делегата

public double rab(Funk f, double x) { return f(x); }

//Объявление функции, используюшей делегат

private void button1_Click(object sender, EventArgs e)

{

string st;

double x, y;

textBox2.Text = "";

x = Convert.ToDouble(textBox1.Text);

st="Значение x=" +textBox1.Text+ "\r\n";

textBox2.AppendText(st);

y = rab(Math.Sin, x); // Применение делегата

st = "Sin(x)=" + y.ToString() + "\r\n";

textBox2.AppendText(st);

y = rab(Math.Log, x); // Применение делегата

st = "Log(x)=" + y.ToString() + "\r\n";

textBox2.AppendText(st);

y = rab(Math.Cos, x); // Применение делегата

st = "Cos(x)=" + y.ToString() + "\r\n";

textBox2.AppendText(st);

y = rab(Math.Exp, x); // Применение делегата

st = "Exp(x)=" + y.ToString() + "\r\n";

textBox2.AppendText(st);

y = rab(Math.Round, x); // Применение делегата

st = "Round(x)=" + y.ToString() + "\r\n";

textBox2.AppendText(st);

}

}

}

Работа программы изображена на рисунке 13.1.

Рисунок 13.1 – Использование делегата

Естественно можно навести «красоту» в код программы, например,

private void button1_Click(object sender, EventArgs e)

{

string st;

Funk[] ff={Math.Sin, Math.Log, Math.Cos, Math.Exp,Math.Round};

string[] sfu = { "Sin", "Log", "Cos", "Exp", "Round" };

double x, y;

textBox2.Text = "";

x = Convert.ToDouble(textBox1.Text);

st="Значение x=" +textBox1.Text+ "\r\n";

textBox2.AppendText(st);

for (int i = 0; i < 5; i++)

{

y = rab(ff[i], x);

st = sfu[i]+"=" + y.ToString() + "\r\n";

textBox2.AppendText(st);

}

}

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

Еще раз отметим особенность делегатов – динамически (во время выполнения программы) обращаться к вызываемым методам. Эта особенность делегатов часто используется при создании базовых конструкций программ, в которые можно добавлять различные создаваемые фрагменты, например, фрагменты меню, включающие «однотипные» методы.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: