Существует множество задач, требующих проведения вычислений с использованием «однотипных» методов, таких как математические функции реального типа (тригонометрические функции, логарифмы, экспоненты и т. д.). В таких расчетах следует использовать метод, формальным параметром которого является название вычислительной функции.
В языке C# методы могут быть размещены только внутри класса. Поэтому в языке C# добавлен специальный класс, который позволяет сохранять ссылки на «однотипные» методы. Он называется делегат класса. По определению переменная типа класса является объектом. Класс, который позволяет описывать набор объектов, каждый из которых является функцией (или ссылкой на функцию), называется функциональным типом. Таким образом, на языке C# делегаты предназначены для описания функциональных типов. Экземпляры такого класса-являются ссылками на функции ( методы), как и на переменные, на них выделяются места из памяти компьютера (их первичные адреса являются «точками " доступа к функциям и передаются ссылками) Такая особенность делегата определила два способа его применения-для самостоятельного решения задачи или для поддержки событий (следующая лекция).
В этой лекции мы рассмотрим индивидуальное использование делегатов для решения некоторых задач. В формате записи делегата дается описание методов, которые он может вызвать: [спецификации] delegate<тип><имя > (<параметры>); здесь спецификаторы определяют условия доступа делегата; delegate-служебное слово;
<тип > - тип возвращаемого результата;
<имя > - имя делегата (уникальный идентификатор);
<параметры > - формальные параметры вызова.
Например, описание всех функций конкретного типа с аргументом конкретного типа имеет следующий вид: public delegate double Funk(double argym); В соответствии с этим описанием любая функция может быть использована в качестве параметра вызова конструктора класса, т. е. делегата. Он возвращает конкретный экземпляр делегата-ссылку на функцию. Особенностью работы делегата является создание ссылок (динамически) в процессе работы программы, а не на этапе компиляции программы.
Методы базовых классов делегатов
Следует отметить, что CTS на платформе .NET имеет абстрактные классы System.Delegate и 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) — удаляет метод значения из списка методов исходного делегата;
общедоступное запечатанное переопределение Delegate[] GetInvocationList() — возвращает все методы, связанные с делегатом.
Для делегатов существует понятие многоадресного делегата — делегата, указывающего на любое количество функций. Поскольку все делегаты C# являются производными от System.MulticastDelegate, любой делегат в C# может быть многоадресным делегатом.
Воспользуемся свойством «многоадресность» для делегата программы, выполняющей вычисление функций точного типа. Код программы написан в обработчике нажатия кнопки, поэтому показан только этот фрагмент кода:
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 = "Хмәні=" + 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);
}
}
Работа программы представлена на рис. 27.2.
Рисунок 27.2-использование Многоадресного делегата
Работа «многоадресного» делегата организована по принципу стека, как показано на рис.27.2.
Следует отметить, что делегаты рассматриваются как специальный класс, предназначенный для хранения ссылок, ориентированных на методы. Любой объект (а также объект делегата) имеет форму ссылки и может быть отправлен в качестве параметра для некоторых методов для дальнейшей работы. Таким образом обеспечивается функциональная параметризация: в методы можно передавать не только данные, но и различные методы их обработки.События
В основе работы операционной системы Windows лежит принцип управления событиями. Это означает, что все приложения для системы и Windows ожидают действий пользователя или сообщений операционной системы после запуска и реагируют на них в определенном порядке - события генерируются через очередь сообщений приложения. Каждый элемент управления (кнопка или строка меню) имеет свой идентификатор. Когда вы нажимаете кнопку или выбираете путь меню, Windows вставляет сообщение в очередь сообщений приложений. Он будет идентификатором элемента управления, используемого в сообщении. Таким образом, операционная система Windows перенаправляет сообщение из используемого элемента управления в очередь приложения.Если в окне формы нажата кнопка, то нажатие кнопки (сообщение) возвращается через операционную систему Windows в очередь хабрлам окна формы и после этого появляется событие Click кнопки. Итак, механизм возникновения события понятен, но что такое событие? В лекции 21 (структура класса) мы определили события класса как специальные действия, которые позволяют событиям реагировать на действия пользователя класса или определенные изменения программы. После этого определения события и методы являются синонимами обработчика событий. Давайте определим эти понятия. каждый объект является экземпляром некоторого класса.
Свойства класса определяют его состояние, а методы класса определяют его действия. Все объекты имеют одинаковое множество свойств, но свойства объектов имеют разные значения, поэтому объекты одного класса могут существовать в разных условиях. Например, в объектах класса» сотрудник, «значение свойства» вход " может отличаться, и эти объекты могут находиться в разных состояниях. Например «»я хочу купить автомобиль, но у меня нет к нему условий...". Все объекты имеют одинаковые методы и имеют одинаковое множество событий для всех объектов одного класса. Но методы обработки возникшего события могут быть разными. Например, события Click двух кнопок формы («Ввод данных», «Переход на форму 2») одинаковы, но обработчики событий (их коды) разные. Таким образом, событие как свойство класса является общим для всех объектов, и для каждого конкретного экземпляра класса его реализация различна.
События позволяют определить персонализированное поведение объекта при появлении некоторого сообщения. Таким образом, события класса – это специальные методы, которые позволяют классу реагировать на действия пользователя или изменения в программе. Для большинства действий пользователя или обработчиков событий разработана заготовка (Properties - >Events). Visual Studio.NET некоторые из наиболее часто используемых событий среды Для каждого элемента управления Windows–приложения определен свой набор событий, и он может реагировать на эти события. По обработчикам событий заготовка образца создается двойным щелчком по полю, расположенному справа от имени соответствующего события на странице Events в окне Properties нужного элемента управления.
События, часто используемые в элементах управления:
Click, DoubleClick-один или два щелчка мыши;
Keydown, KeyUp – нажатие любой клавиши (сочетания клавиш) или ее отправка;
Keypress-нажатие клавиши (с ASCII-кодом);
MouseDown, MouseUp-нажать кнопку мыши или отправить ее;
MouseMove-замена мыши;
Paint-появляется, когда нужно нарисовать форму.
Например, если дважды щелкнуть по кнопке «Кликнуть", расположенной в форме, то создается обработчик этого события, запись заголовка обработчика приведена ниже: private void button1_Click(object sender, EventArgs e).Если нам нужно отредактировать событие,вызванное двойным нажатием кнопки, нам нужно дважды «Кликнуть» по полю «справа от события keydown " в "событии" формы, в результате чего появится шаблон обработчика этого события, запись заголовка обработчика будет выглядеть следующим образом: private void Form1_MouseDoubleClick(Object sender, MouseEventArgs e).
В качестве примера покажем образцы еще двух обработчиков событий: private void textBox1_KeyDown(object sender, KeyEventArgs e) private void Form1_MouseClick(object sender, MouseEventArgs e) Попробуйте сами определить, когда они будут созданы? Все шаблоны обработчика событий имеют два формальных параметра, а также первый параметр (object sender) одинаков для всех. Во многих учебниках по программированию на языке C# при объяснении механизма работы события используется шаблон «публикация-подписка". По этому шаблону один класс отправителя сообщения (sender) публикует сообщение, а другой класс получателя сообщения записывается на получение этих сообщений.Согласно терминологии, изложенной выше, первым формальным параметром всех обработчиков сообщений типа senderobjectobject (на языке C# класс object является базовым классом для любого класса) является отправитель сообщений. Вторым формальным параметром в моделях обработчика событий является переменная объектного типа (ссылка на объект класса ХХХEventArgs). Например, указатель мыши e для обработчика мыши.X e.Координаты Y можно получить. Класс xxxeventargs (ХХХ – название события) является преемником системного класса EventArgs во всех стандартных событиях. Примечание, все визуальные элементы управления распределены из класса Control.
Достарыңызбен бөлісу: |