Иллюстрированный самоучитель по VB.NET

       

Групповые делегаты как члены классов


В предыдущем примере все модули имеют доступ ко всем функциям остальных модулей. Такую архитектуру нельзя признать удачной — правильнее было бы оформить делегат в виде члена класса, нежели в виде открытого объекта. Это позволит выполнить перед его созданием проверку, аналогичную той, которая выполняется для других членов класса. Ниже приведен слегка измененный вариант предыду-

щей архитектуры, где перед дополнением группового делегата новыми функциями выполняется проверка (в данном примере — весьма тривиальная). Соответствующий фрагмент выделен жирным шрифтом:

Option Strict On

Public Class DelegateServer

Public Delegate Sub ClientCallback(ByVal IngVal As Long)

Private m_Clients As ClientCallback

' Использовать конструктор по умолчанию

Public Sub RegisterDelegate(ByVal aDelegate As

ClientCallback.ByVal dolt As Boolean)

' Обычно здесь выполняется полноценная проверка.

' В данном примере функция обратного вызова регистрируется

' лишь в том случае, если второй параметр равен

True. If dolt Then



m_Clients = CType(System.Delegate.Combine(m_ Clients.aDelegate)._

ClientCallback)

End If

End Sub

Public Sub CallClients(ByVal IngVal As Long)

m_Clients( IngVal)

End Sub

End Class

Module Modulel

Sub Main()

Dim delsrv As New DelegateServer()

delsrv.RegisterDelegate(AddressOf DelegateCallbackHandlerl.True)

' He вызывается - второй параметр равен False!

delsrv.RegisterDelegate(AddressOf DelegateCal1backHandler2.False)

' Инициировать обращение к клиентам

delsrv.CallClients(125)

Console.WriteLine("Press enter to end.")

Console.ReadLine()

End Sub

Public Sub DelegateCallbackHandlerKByValIngVal As Long)

System.Console.WriteLine("DelegateCa11backHandlerl cal1ed")

End Sub

Public Sub DelegateCallbackHandler2(ByVal IngVal As Long)

System.Console.Wri teLine("DelegateCal1backHandler2 cal1ed")

End Sub

End Module



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