Модули и классы
Программный код в Visual Basic хранится в модулях. Существуют три вида модулей: модуль формы (Form), стандартный модуль (Module) и модуль класса (Class Module).
• Модуль формы (расширение файла *.frm) является основой большинства приложений Visual Basic. Модуль формы содержит процедуры обработки события, общие процедуры и объявленные на уровне формы: переменные, константы, типы и внешние процедуры. Если открыть модуль формы в текстовом редакторе, можно увидеть описания формы и её элементов управления, включая их свойства. Код, размещённый в модуле формы, может ссылаться на другие формы или объекты приложения.
• Стандартный модуль (расширение файла *.bas) является контейнером для процедур, функций и объявлений, к которым обычно получают доступ другие модули приложения. Они могут содержать глобальную переменную (доступную всему приложению) или описанные на уровне модуля: переменные, константы, типы, внешние и глобальные процедуры. Код, размещённый в стандартном модуле, может быть не связан с определенным приложением; если не использовать ссылки на модуль формы или имена элементов управления, стандартный модуль может быть использован в других приложениях.
• Модуль класса (расширение файла *.cls) является основой объектно-ориентированного программирования в Visual Basic. Модуль класса используется для создания новых объектов. Эти объекты могут иметь собственные свойства, методы и события. Фактически, форма — просто модуль класса, который может содержать элементы управления, помещенные в него, и выводить их на экран. Классы могут содержать специальные процедуры Class_Initialize и Class_Terminate, которые фактически являются конструктором и деструктором.
Объектно-ориентированное программирование
Простое взаимодействие между объектами является одним из базовых составляющих парадигмы Visual Basic. Сам объект называется экземпляром класса. Объектная модель VB предоставляет различные классы для работы с формами, элементами управления, буфером обмена, коллекциями, экраном и т. д. Для взаимодействия с другими объектами класс предоставляет разработчику интерфейс, состоящий из свойств, методов и событий.
Создание нового объекта из класса возможно ранним или поздним связыванием. Для раннего связывания используется ключевое слово New перед именем класса. Для позднего связывания используется функция CreateObject возвращающая ссылку на созданный объект. Присваивание ссылок осуществляется в переменные с типом Object, используя оператор Set. Доступ к методам и свойствам класса происходит через оператор — точку ., который ставится сразу после имени переменной объектного типа. Если класс содержит события, то переменные объявляются с ключевым словом WithEvents, тем самым будут доступны процедуры обработки событий.
Пример показывает взаимодействие программы с библиотекой Microsoft Scripting Runtime, предоставляющая объекты для работы с файловой системой:
Public Sub Main()
Dim objFSO As New FileSystemObject 'Создаём экземпляр класса, используя оператор New
Dim objWindows As Folder
Set objWindows = objFSO.GetFolder(Environ("SYSTEMROOT")) 'Вызываем метод класса GetFolder и присваиваем ссылку на полученный объект
MsgBox "Папка Windows: " & objWindows.Path 'Читаем свойства класса
MsgBox "Дата создания: " & Format(objWindows.DateCreated, "YYYY-MM-DD H:mm:ss")
Dim sTextFilePath As String
Dim objTS As TextStream
sTextFilePath = objFSO.BuildPath(Environ("TEMP"), "Тестовый файл.txt") 'Метод с двумя параметрам возвращает значение типа String
Set objTS = objFSO.CreateTextFile(sTextFilePath, True)
objTS.Write "Привет, Википедия!"
objTS.Close
objFSO.DeleteFile sTextFilePath, True
Set objFSO = Nothing 'Присваивая Nothing, происходит освобождение ссылки, и объект может вызвать процедуру деструктора
Set objWindows = Nothing 'VB автоматически вызывает деструктор, если на объект больше не ссылаются
Set objTS = Nothing
End Sub
Visual Basic позволяет разработчику самому создавать новые классы. В отличие от других языков программирования, таких как Java и C++, Visual Basic имеет неполную поддержку ООП.
Как известно, абстрактный класс необходим, чтобы предоставить шаблон для интерфейса другим классам. В Visual Basic классы имеющие члены класса, но не содержащие реализацию, можно использовать в качестве абстрактных классов, но фактически они ими не являются. Из классов Visual Basic всегда можно создать объекты, даже если они не содержат кода[2]
Принцип инкапсуляции действует в Visual Basic. Чтобы разграничить доступ к членам класса, служат модификаторы Public, Private и Friend, используемые при описании процедур, функций, констант, переменных и пользовательских типов.
Наследование реализации не поддерживается. Visual Basic обеспечивает только поддержку наследования интерфейса через оператор Implements. При наследовании интерфейса любой класс может действовать как базовый класс интерфейса. Вообще любой класс, может выступать как базовый класс интерфейса.
Полиморфизм обеспечивается только через интерфейсы, так как наследование VB не поддерживает. Реализация полиморфизма показана на примере классов Автомобиль и Самолёт реализующие интерфейс класса Транспорт.
'Класс ITransport.cls
Public Function GetMaxSpeed() As Long
End Function
'Класс CAuto.cls
Implements ITransport 'Наследуем интерфейс
Private Function ITransport_GetMaxSpeed() As Long 'Реализация метода
ITransport_GetMaxSpeed = 240
End Function
'Класс CFly.cls
Implements ITransport
Private Function ITransport_GetMaxSpeed() As Long
ITransport_GetMaxSpeed = 700
End Function
'Стандартный модуль Program.bas
Option Explicit
Public Sub Main()
Dim T As ITransport 'Объявляем переменную с типом ITransport
Set T = New cAuto
WhatTransportSpeed T 'Передаем ссылку в процедуру, которая вызовет нужный метод класса, в зависимости от реализации
Set T = New cFly
WhatTransportSpeed T
End Sub
'Функция имеет аргумент, который принимает ссылку на объект, реализующий интерфейс ITransport
Public Sub WhatTransportSpeed(Transport As ITransport)
MsgBox "Максимальная скорость: " & Transport.GetMaxSpeed()
End Sub
