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



              


Практический пример: специализированная сортировка - часть 2


For i =bottom To (top - bottom) For j =i + 1 To top

If Stuff(j) < Stuff(i))Then

temp = Stuff(i)

Stuff(i) = Stuff(j)

Stuff(j) = temp

End If

Next j

Next I

Чтобы реализовать этот алгоритм с применением функций обратного вызова, необходимо определить класс Special Sort с делегатом, используемым при обратном вызове. Код этого класса приведен ниже:

1 Public Class Special Sort

2 ' Определение делегата

3 Public Delegate Function SpecialCompareCallback(ByVal flrstString _

As String,ByVal secondString As String) As Boolean

4 ' Определение процедуры, вызываемой делегатом

5 Public Shared Sub IfySort(ByVal Stuff As String()._

ByVal MyCompare As SpecialCompareCallback)

6 Dim i, j As Integer

7 Dim temp As String

8 Dim bottom As Integer = Stuff.GetLowerBound(0)

9 Dim top As Integer = Stuff.GetUpperBound(0)

10 For i = bottom To (top = bottom)

11 For j = i + 1 To top

12 If MyCompare(Stuff(j). Stuff(i)) Then

13 temp = Stuff(i)

14 Stuff(1) - Stuff (j)

15 Stuff(j) = temp

16 End If

17 Next j

18 Next i

19 End Sub

20 End Class

В строке З определяется делегат, при помощи которого классу передается информация об используемом порядке сортировки. Делегат может инкапсулировать любую функцию, которая, как и все нормальные функции сравнения строк, получает два строковых параметра и возвращает логическую величину.

В строке 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




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