Построение классов событий
В предыдущем примере мы воспользовались готовым классом System.EventArgs. Возможности этого класса весьма ограничены, поскольку его конструктор вызывается без аргументов. При более профессиональном подходе в программе определяется новый класс события, дополняющий этот базовый класс. Например, в него можно включить ReadOnly-свойство, возвращающее информацию о предполагаемом повышении зарплаты, и другое свойство для текста сообщения.
Пример подобного класса приведен ниже (решение CustomEventArgExample в архиве). Запрашиваемый рост зарплаты и сообщение инкапсулируются в конструкторе события. В дальнейшем для получения этих данных используются два свойства, доступных только для чтения:
Public Class ImproperSalaryRaiseEvent Inherits System.EventArgs Private m_Message As String Private m_theRaise As Decimal Sub New(ByVal theRaise As Decimal. ByVal theReason As String) MyBase.New() m_Message = theReason m_theRaise = theRaise End Sub Readonly Property Message() As String Get Return m_Message End Get End Property Readonly Property theRaise() As Decimal Get Return m_theRaise End Get End Property End Class
После того как этот класс будет включен в решение, следует внести небольшие изменения в объявление события в классе Employee:
Public Event SalarySecurityEvent(ByVal Sender As CustomEventArgExample.EmployeeWithEvents. ByVale As ImproperSalaryRaiseEvent)
Теперь во втором аргументе передается переменная класса ImproperSalaryRaiseEvent. Следующие изменения вносятся во фрагмент, в котором непосредственно вызывается событие:
Public Overloads Sub RaiseSalary(ByVal Percent As Decimal) If Percent > LIMIT Then ' Операция запрещена – необходим пароль RaiseEvent SalarySecurityEvent(Me, New ImproperSalaryRaiseEvent(Percent, "INCORRECT PASSWORD!")) Else m_Salary =(1 + Percent) * m_Salary End If End Sub
Остается лишь слегка исправить код обработчика события.
Module Modulel Private WithEvents anEmployee As EmployeeWithEventsII Sub Maine) Dim tom As New EmployeeWithEventsII("Tom". 100000) anEmployee = tom Console.Wntel_ine(tom.TheName &"has salary " & tom.Salary) anEmployee.RaiseSalary(0.2D)'Суффикс D – признак типа Decimal Console.WriteLine(tom.TheName & "still has salary " & tom.Salary) Console.Writeline("Please press the Enter key") Console.ReadLine() End Sub Public Sub anEmployee_SalarySecuhtyEvent(ByVal Sender _ As CustomEventArgExample.EmployeeWithEvents. ByVal e As CustomEventArgExample.ImproperSalaryRaiseEvent) Handles anEmployee.SalarySecurityEvent MsgBox(Sender.TheName & "had an improper salary raise of " & _ FormatPercent(e.theRaise) & "with INCORRECT PASSWORD!") End Sub End Module
Результат показан на следующем рисунке. Как видно из рисунка, данные о запрошенном росте заработной платы доступны в обработчике события.