Почему некоторые классы имеют "I" перед своим именем? - PullRequest
5 голосов
/ 05 июня 2019

Я работаю с некоторым устаревшим кодом в Visual Basic 98, и есть несколько классов с «I» перед их именем. Однако большинство классов не имеют этого названия.

Вот содержимое файла IXMLSerializable.cls.

' Serialization XML:
'       Create and receive complete split data through XML node
Public Property Let SerializationXML(ByVal p_sXML As String)
End Property
Public Property Get SerializationXML() As String
End Property

Public Property Get SerializationXMLElement() As IXMLDOMElement
End Property

Ответы [ 3 ]

3 голосов
/ 05 июня 2019

Обратите внимание, что VBA поддерживает интерфейсы, как и C#/VB.NET (почти).Интерфейсы - это only способ предоставления механизмов наследования в VBA.

По соглашению интерфейсы начинают свое имя с заглавной буквы I.

Вот пример объявления интерфейса, в котором говорится, что объект должен определять свойство имени

[File: IHasName.cls, Instancing: PublicNotCreatable] 
Option Explicit

Public Property Get Name() As String
End Property

Как видите, реализация не требуется.

Теперьсоздать объект, который использует интерфейс, чтобы объявить, что он содержит свойство name.Конечно, дело в том, что есть несколько классов, которые используют один интерфейс.

[File: Person.cls, Instancing: Private]
Option Explicit
Implements IHasName

Private m_name As String

Private Sub Class_Initialize()
    m_name = "<Empty>"
End Sub

' Local property
Public Property Get Name() as String
    Name = m_name
End Property

Public Property Let Name(ByVal x As String)
    m_name = x
End Property

' This is the interface implementation that relies on local the property `Name` 
Private Property Get IHasName_Name() As String
    IHasName_Name = Name
End Property

Для удобства в пользовательском интерфейсе после включения оператора Implements вы можете выбрать свойства интерфейса сверху

scr

И для использования приведенного выше кода используйте следующий тест, который вызывает функцию, которая может принимать любой объект, реализующий IHasName.

[File: Module1.bas]
Option Explicit

Public Sub TestInterface()

    Dim target As New Person
    target.Name = "John"

    GenReport target
    ' This prints the name "John".
End Sub

Public Function GenReport(ByVal obj As IHasName)
    Debug.Print obj.Name
End Function
2 голосов
/ 05 июня 2019

I означает Интерфейс , как указано в Официальной документации Microsoft :

Члены IXMLDOMElement.

В следующих таблицах показаны свойства, методы и события.

В C ++ этот интерфейс наследуется от IXMLDOMNode .

Это было довольно распространенное соглашение, и вы сразу же знаете, что оно представляет собой Interface, не глядя на код.

Надеюсь, это поможет.

0 голосов
/ 05 июня 2019

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...