Практический пример: специализированная сортировка
В строке 3 определяется делегат, при помощи которого классу передается информация об используемом порядке сортировки. Делегат может инкапсулировать любую функцию, которая, как и все нормальные функции сравнения строк, получает два строковых параметра и возвращает логическую величину.
В строке 5 определяется общая процедура, одним из параметров которой является переменная с типом делегата. Таким образом, в ключевой строке 12:
If MyCompare(Stuff(j). Stuff(i)) Then
Функция сравнения, инкапсулированная в делегате MyCompare, может относиться к другому классу! Например, если определить приведенный ниже класс, эта схема позволит использовать любой из его методов Compare (обратите внимание: методы Compare объявлены общими, поэтому для их вызова нам даже не нужно создавать конкретный экземпляр класса):
Public Class MyCustomCompare Public Shared Function TheBasicComparetByVal firstString As String, ByVal secondString As String) As Boolean Return (firstString ← secondString) End Function Public Shared Function TheSpecialCompare(ByVal firstString As String. ByVal secondString As String)As Boolean Dint tokensl,tokens2 As String() tokens1 = firstString.Split(Chr(32)) tokens2 = secondString.Split(Chr(32)) Return (tokensl(l) ← tokens2(l)) ' Сравнение по фамилии! End Function End Class
Класс содержит две общие функции, которые ниже будут использованы для создания делегатов. Первая функция, TheBasicCompare, просто сравнивает строки в алфавитном порядке. Более интересная функция TheSpecialCompare предполагает, что строка передается в формате "имя фамилия", и сравнивает фамилии, выделяя их при помощи удобной функции Split.
Остается лишь создать экземпляры класса SpecialSort и делегаты. Это происходит в следующей функции Main:
1 Module Modulel 2 Sub Main() 3 Dim test()As String ={"Mike Iem"."Dave Mendlen"."Alan Carter". 4 "Tony Goodhew","An Bixhorn"."Susan Warren"} 5 ' Объявить переменную обратного вызова в форме класс.делегат 6 Dim MyCallBack As Special Sort.SpecialCompareCal1back 7 MyCallBack = AddressOf MyCustomCompare.TheBasicCompare 8 SpecialSort.MySort(test,MyCallBack) 9 Console.WriteLine("Here is a basic sort by FIRST name") 10 Dim temp As String 11 For Each temp In test 12 Console.WriteLine(temp) 13 Next 14 ' Передать другую процедуру сравнения 15 MyCallBack = AddressOf MyCustomCompare.TheSpecialCompare 16 Sped al Sort. MySort (test. MyCallBack) 17 Console.WriteLine() 18 Console.WriteLineC'Here is a sort by LAST name") 19 For Each temp In test 20 Console.WriteLine(temp) 21 Next 22 Console. ReadLine() 23 End Sub 24 End Module
В строке 6 объявляется "псевдоуказатель на функцию". Чтобы задать его значение, мы передаем адрес функции с правильной сигнатурой (строки 7-15). Поскольку функции объявлены общими, создавать экземпляр класса MyCustomCompare для этого не нужно. После создания делегата в строках 8 и 16 вызывается нужная процедура сортировки класса SpecialSort. Поскольку при вызове MySort передается делегат, процедура обращается к классу MyCustomCompare и узнает, по какому критерию должно осуществляться сравнение.