Статья располагается на двух страницах. Вторая часть Использование делегатов в событиях на c#.
Перед использованием события нужно определить связанный с ним класс делегата. Знаем, что события позволяют одному событию информировать другой объект, о том, что что-то произошло.
Хочу показать использование делегатов в событиях на примере банковских счетов.
Представьте себе банк, в который Вы приходите и говорите, что хотите открыть счет. Мы не будем вдаваться во все детали реальной жизни, поскольку ни к чему. Будем считать, что для открытия счета сума первого вноса должна состоять не меньше 0$. Если будет введена сума меньше 0$, возбудим событие. Так же, при наличии открытого счета, если будет сделана попытка снять больше денег, чем на счету, возбудим событие.
С идеей разобрались, по этому, приступим. Как уже было сказано, что перед использованием события нужно определить связанный с ним класс делегата:
public delegate void MyDelegate(object user,SecurytyMonitor ment);
Первый параметр, это объект, который возбудил событие, второй параметр, это обьект класса SecurytyMonitor который унаследован от класса EventArgs. А вот и сам класс SecurytyMonitor:
class SecurytyMonitor:EventArgs
{
private string message; // сообщение
/// <summary>
/// свойство для чтения сообщения
/// </summary>
public string Message
{
get { return message; }
}
/// <summary>
/// конструктор с одним параметром
/// </summary>
/// <param name="msg">текстовое сообщение</param>
public SecurytyMonitor(string msg)
{
message = msg;
}
/// <summary>
/// подписывает событие на метод,
/// который вызывается при возбуждение события
/// </summary>
/// <param name="b">
/// обьект класса Bank,
/// с помощью которго мы доступаемся к событию
/// </param>
public void DoEvent(Bank b)
{
b.OnStop+= new Bank.MyDelegate(Display);
}
/// <summary>
/// выводит сообщение, полученое при возбуждение события
/// </summary>
/// <param name="o">обьект который возбудил событие </param>
/// <param name="sc">обьект класса SecurytyMonitor,
/// который унаследован от EventArgs
/// </param>
public void Display(object o, SecurytyMonitor sc)
{
Console.WriteLine(sc.Message);
}
}
В этом классе объявлено приватное поле message, которое, как будет потом показано, используется для хранения сообщения о том, что что-то произошло. По сути дела, это класс можно считать служебным.
Сообщение устанавливается в конструкторе, и получить его можно только через свойство только для чтения!
Осмыслите пока эту часть, посвященную создания информационного класса события, и после этого переходите ко второй части статьи, где мы уже используем созданный класс события.
Вторая часть Использование делегатов в событиях на c#