Методы базовые классы делегатов
Необходимо отметить, что в CTS платформы .NET есть абстрактные классы System.Delegаte и System.MulticastDelegate из которых (как из базовых) создаваемые делегаты могут наследовать некоторые методы.
Перечень свойств и методов, наиболее часто наследуемых создаваемыми делегатами от System.MulticastDelegate, можно представить следующим списком:
public MethodInfo Method {get:}– это свойство возвращает имя метода, на который указывает делегат;
public object Target {get:} – если делегат указывает на метод – член класса, то Target возвращает имя класса метода; если метод статический, то Target возвращает null;
public static Delegate Combine(Delegate[]) – добавляет новые методы к группе методов, обрабатываемых делегатом;
public static Delegate Remove(Delegate source, Delegate value) – удаляет метод value из списка методов делегата source;
public sealed override Delegate[] GetInvocationList() – возвращает список всех связанных с делегатом методов.
Для делегатов существует понятие многоадресный делегат – делегат, способный указывать на любое количество функций. Поскольку все делегаты языка С# являются производными классами от System.MulticastDelegate, то любой делегат С# потенциально является многоадресным.
Применим свойство многоадресности для делегата нашей программы вычисления вещественных функций. Изменения связаны только с обработчиком кнопки, поэтому приведен только фрагмент этого кода:
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);
Funk df = Math.Sin;
for (int i = 1; i < 5; i++)
df += ff[i]; //df = df + ff[i];
for (int i = 4; i >= 0; i--)
{
y = rab(df, x);
df -=ff[i]; //df = df - ff[i];
st = sfu[i]+"=" + y.ToString() + "\r\n";
textBox2.AppendText(st);
}
}
Работа программы приведена на рисунке 13.2.
Рисунок 13.2 – Использование многоадресного делегата
Из рисунка 13.2 видно, что работа многоадресного делегата организована по принципу стека.
Заканчивая рассмотрения делегатов как специальный класс, предназначенный для хранения ссылок на методы, необходимо отметить, что любой объект представляет собой ссылку (в том числе и объект делегата) и может быть передан в некоторые методы в качестве параметра для дальнейшей работы.
Таким образом обеспечивается функциональная параметризация: в методы можно передавать не только данные, но и различные методы их обработки.
Дата добавления: 2018-11-25; просмотров: 337;