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



              


Создание делегата - часть 2


В этом нетрудно убедиться, просматривая полученный IL-код при помощи программы ILDASM.

Согласитесь, такой способ вывода в консольном окне строки «HelloHello» выглядит несколько необычно!

Впрочем, «если это и безумие, то в своем роде последовательное». Предположим, вы решили усовершенствовать свой класс, чтобы вместо простого вывода текста в консольном окне на экране появлялось окно сообщения. Для этого достаточно внести изменения, выделенные жирным шрифтом в следующем листинге:

Module Modulel

Public Delegate Sub StringSubDelegate(ByVal aString As String)

Sub Main()

Dim test As New ClassForStringSubDelegate()

Dim aDelegate As StringSubDelegate

aDelegate - AddressOf test.TestMsgBox

aDelegate("Hello")

Console. ReadLine()

End Sub

Class ClassForStringSubDelegate

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

Public Sub TestSub(ByVal aString As String)

Console.WriteLine(aString SaString)

End Sub

Public Sub TestMsgBox(ByVal aString As String)

MsgBox(aString &aString)

End Sub

End Class End Module

Поскольку для делегата важна только сигнатура инкапсулированного метода, он легко «переключается» на другой метод. Потребовалось создать новую версию для вывода информации в окне отладки (вместо консоли и окна сообщения)? Достаточно внести несколько изменений в делегат и добавить в класс функцию, инкапсулируемую делегатом.

Важнейшая особенность делегатов заключается в том, что связывание с методом производится на стадии выполнения. Таким образом, делегаты в сочетании с явным или неявным вызовом метода Invoke по своим возможностям значительно превосходят функцию VB6 CallByName.




Содержание  Назад  Вперед