Cамоучитель по VB.NET

       

Построение классов событий



В предыдущем примере мы воспользовались готовым классом 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

После того как этот класс будет включен в решение, следует внести небольшие изменения в объявление события в классе Empl oyee:

Public Event SalarySecurityEvent(ByVal Sender As

CustomEventArgExample.EmployeeWithEvents. ByVale As

ImproperSalaryRaiseEvent)

Теперь во втором аргументе передается переменная класса ImproperSalaryRai seEvent. Следующие изменения вносятся во фрагмент, в котором непосредственно вызывается событие:

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

Результат показан на следующем рисунке. Как видно из рисунка, данные о запрошенном росте заработной платы доступны в обработчике события.



Содержание раздела