I
обозначает интерфейс.Говорят, что VBA и более ранние диалекты Visual Basic до VB 6.0 являются объектно-ориентированными, но имеют очень слабую поддержку.Например, нет наследования классов.Тем не менее, вы можете объявить и реализовать интерфейсы в VBA / VB6;однако ключевое слово Interface
отсутствует, так как есть ключевое слово Class
.Вместо этого вы просто объявляете класс с пустыми подпрограммами, функциями и свойствами.
Пример.В классе с именем IComparable
объявите Function CompareTo
:
Public Function CompareTo(ByVal other As Object) As Long
'Must return -1, 0 or +1, if current object is less than, equal to or greater than obj.
'Must be empty here.
End Function
Теперь вы можете объявить классы, реализующие этот интерфейс.Например, класс с именем clsDocument
:
Implements IComparer
public Name as String
Private Function IComparable_CompareTo(other As Variant) As Long
IComparable_CompareTo = StrComp(Name, other.Name, vbTextCompare)
End Function
Теперь это позволяет создавать алгоритмы поиска и сортировки, которые можно применять к различным типам классов, реализующим этот метод.Пример класса с именем Document
Option Explicit
Implements IComparable
Public Name As String
Public FileDate As Date
Public Function IComparable_CompareTo(ByVal other As Object) As Long
Dim doc As Document, comp As Long
Set doc = other
comp = StrComp(Me.Name, doc.Name, vbTextCompare)
If comp = 0 Then
If Me.FileDate < doc.FileDate Then
IComparable_CompareTo = -1
ElseIf Me.FileDate > doc.FileDate Then
IComparable_CompareTo = + 1
Else
IComparable_CompareTo = 0
End If
Else
IComparable_CompareTo = comp
End If
End Function
Вот пример быстрой сортировки для VBA.Предполагается, что вы передаете ему массив IComparables:
Public Sub QuickSort(ByRef a() As IComparable)
'Sorts a unidimensional array of IComparable's in ascending order very quickly.
Dim l As Long, u As Long
l = LBound(a)
u = UBound(a)
If u > l Then
QS a, l, u
End If
End Sub
Private Sub QS(ByRef a() As IComparable, ByVal Low As Long, ByVal HI As Long)
'Very fast sort: n Log n comparisons
Dim i As Long, j As Long, w As IComparable, x As IComparable
i = Low: j = HI
Set x = a((Low + HI) \ 2)
Do
While a(i).CompareTo(x) = -1: i = i + 1: Wend
While a(j).CompareTo(x) = 1: j = j - 1: Wend
If i <= j Then
Set w = a(i): Set a(i) = a(j): Set a(j) = w
i = i + 1: j = j - 1
End If
Loop Until i > j
If Low < j Then QS a, Low, j
If HI > i Then QS a, i, HI
End Sub