1

Тема: VBScript: использование собственных классов

VBScript поддерживает концепцию объектов и позволяет объявлять классы и создавать их экземпляры. Однако VBScript не поддерживает концепции наследования и полиморфизма. Из-за этих ограничений VBScript называют основанным на объектах (Object Based), а не полностью объектно-ориентированным (Object Oriented) языком. Впрочем, несмотря на ограничения, существует возможность до какой-то степени имитировать наследование, используя при этом так называемую технику делегирования, о которой будет сказано ниже.

В VBScript класс объявляется при помощи оператора Class:

Class Foo
    Private FooAttribute
    Public Sub FooSub()
        MsgBox "Foo.FooSub"
    End Sub
    Public Function FooFunction()
        MsgBox "Foo.FooFuncion"
        FooFunction = "value"
    End Function
End Class

Данный код объявляет новый класс под названием Foo со свойством FooAttribute. Поскольку атрибут задается при помощи ключевого слова Private, он будет виден только для методов, расположенных внутри класса. Если вы хотите, чтобы атрибут был доступен вне класса, попробуйте применить ключевое слово Public. Однако объявление атрибутов как Private и использование для доступа к ним Properties, является хорошей практикой программирования, позволяющей проверять данные перед тем, как они записываются (задаются) или считываются.

Для того чтобы в VBScript создать экземпляр объекта, необходимо использовать ключевые слова Set и New. Также хорошей практикой является объявление переменных при помощи ключевого слова Dim, как этого требует инструкция Option Explicit.

Dim objFoo
Set objFoo = New Foo

Данный код создает экземпляр класса, объявленного в предыдущем примере, и присваивает его переменной objFoo.

Обращение к членам класса осуществляется при помощи точки:

Dim myValue
objFoo.FooSub()
myValue = objFoo.FooFunction()
MsgBox "myValue = " & myValue

В данном коде вызываются два метода, объявленные в определении класса. В первом случае никакого значения не возвращается (метод-процедура), а во втором случае переменной myValue присваивается возвращаемое значение (метод-функция).

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

2

Re: VBScript: использование собственных классов

Концепция Property является хорошим способом использовать ограничение доступа к данным и проверку значений атрибутов:

Class Foo
    Private i_FooAttribute
    Public Property Let FooAttribute(byVal Param1)
        ' ( ... код для проверки значения атрибута ... )
        i_FooAttribute = Param1
    End Property
    Public Property Get FooAttribute
        ' ( ... код для форматирования вывода значения атрибута ... )
        FooAttribute = i_FooAttribute
    End Property
End Class

VBScript не поддерживает механизм наследования и полиморфизма. Однако существует возможность до какой-то степени имитировать наследование, используя так называемую технику делегирования. При этом атрибут производного класса задается как экземпляр теоретического родительского класса. Затем задаются методы для всех "наследуемых" методов, которые, в свою очередь, просто вызывают (или делегируют) методы родительского экземпляра. Создадим класс, производный от класса Foo:

Class SubFoo
    Private parent
    Private Sub Class_Initialize()
        Set parent = New Foo
    End Sub
    Public Sub FooSub()
        parent.FooSub
    End Sub
    Public Function FooFunction()
        FooFunction = parent.FooFunction
    End Function

    Public Sub SubFooSub
        MsgBox "уникальный метод класса SubFoo"
    End Sub
End Class

Dim objSubFoo, value
Set objSubFoo = New SubFoo
objSubFoo.FooSub
value = objSubFoo.FooFunction
objSubFoo.SubFooSub
MsgBox "Value = " & CStr(value)

Уловкой здесь является ссылка атрибута parent на "родительский класс". Эта ссылка образуется автоматически при создании объекта класса SubFoo, из-за конструктора  SubFoo, заданного специальным частным (private) методом Class_Initialize. О концепциях конструктора и деструктора - ниже.

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

3

Re: VBScript: использование собственных классов

VBScript поддерживает концепцию конструктора с помощью метода Class_Initialize. Это частный (private) метод. Он не принимает параметров и вызывается автоматически при создании нового экземпляра класса. При использовании ключевого слова New вызывается метод Class_Initialize, если таковой существует.

Чтобы обойти ограничения в отношении параметров Class_Initialize, можно написать специальную функцию, например:

Function NewFoo(Param1, Param2, ...)
    Dim myFoo
    Set myFoo = New Foo
    myFoo.attr1 = Param1
    myFoo.attr2 = Param2
    ' ( ... дополнительные шаги инициализации ... )
    Set NewFoo = myFoo
End Function

В качестве метода, автоматически вызываемого при разрушении объекта, используется метод Class_Terminate():

Class Foo
    ' ( ... код класса ... )
    Sub Class_Terminate()
        ' ( ... код очистки ... )
    End Sub
End Class

Работа с классами может значительно ускорить цикл разработки приложения, поскольку даёт возможность инкапсулировать данные и логику, чтобы обрабатывать эти данные в том же самом контейнере. Несмотря на отсутствие поддержки концепции наследования и полиморфизма, в остальном язык является объектно-ориентированным, что даёт много возможностей для написания достаточно сложных приложений.

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