- •Основы алгоритмических языков программирования Понятие о языках программирования. Современные языки программирования высокого уровня
- •Лексические единицы языков программирования
- •Интегрированные среды разработки программ
- •История развития технологии vba
- •Интегрированная среда разработки vba
- •Составные части vba-проекта. Добавление пользовательского кода
- •Вывод отладочных сообщений. Пошаговое выполнение и инструменты отладки
- •Концепция памяти. Переменные и их декларация в языках программирования
- •Управляющие структуры выбора
- •Структурные операторы в алгоритмических языках программирования
- •Данная логическая операция имеет следующую таблицу истинности, в которой «0» соответствует значению false, а «1» – true (табл 1).
- •Остальные логические операторы являются двухоперандными. Операция логического умножения and имеет следующую таблицу истинности (табл 2):
- •Наконец операция логического исключающего или представляется следующей таблицей истинности (табл 4):
- •Реализация управляющих структур выбора в vb
- •Циклические управляющие структуры
- •Реализация циклических управляющих структур в vb
- •Цикл с постусловием имеет похожий синтаксис:
- •Основные положения процедурного программирования
- •Реализация процедурного программирования в Visual Basic
- •Фундаментальные структуры данных
- •Массивы в vb
- •Агрегация разнородных типов. Структурные типы данных
- •Тип данных определяемый пользователем в vb
- •Основы объектно-ориентированного программирования
- •Реализация основных идей объектно-ориентированного программирования в языке vb. Поля и методы. Конструирование объекта класса. Адресная природа объекта класса
- •Свойства и события в vb. Связь объекта класса и его клиентов
- •Интерфейс класса в vb и его наследование
Реализация основных идей объектно-ориентированного программирования в языке vb. Поля и методы. Конструирование объекта класса. Адресная природа объекта класса
Рассмотрим подходы к реализации механизмов объектно-ориентированного программирования (ООП) в языке программирования Visual Basic. В этом языке идеи ООП реализованы наиболее примитивно, но в тоже время интуитивно ясно.
Краеугольным камнем ООП здесь являются особые программные модули – модули классов (class module) – основным предназначением, которых является размещением внутри себя единственного класса объектов, со всеми его полями, методами и свойствами. Имя такого модуля совпадает с именем самого класса. Структура модуля класса полностью аналогична модулю подпрограмм, однако, непосредственное обращение к подпрограммам и переменным такого модуля запрещено. Это возможно только от имени экземпляра объекта класса. Другим важным для понимания класса отличием является способ хранения данных по сравнению со стандартным модулем. Так задание нового значения для открытой глобальной перемененной в стандартном модуле становится видимым в других частях программы. Данные же в модуле класса существуют раздельно для каждой реализации (экземпляра объекта) этого класса. На том же основании можно заключить, что данные в стандартном модуле имеют область видимости всю программу, а время их жизни ограничено временем ее исполнения, тогда как данные для модуля класса существуют только во время жизни отдельного объекта. Переменные модуля класса создаются при создании объекта, а уничтожаются при его разрушении. Наконец, переменная объявленная открытой в стандартном модуле видима во всем проекте, тогда как открытая переменная в модуле класса видима только клиентам (consumer) объекта данного класса.
Рассмотрим простой пример класса объектов:
' Модуль класса CMessage
Public Msg As String ' Поле
Public Sub ShowMessage () ' Метод
MsgBox Msg ' показываем содержимое переменной-поля Msg
End Sub
Всякая переменная объявленная на уровне модуля класса становится полем, а подпрограмма – методом. Единственным видимым отличием модулей класса от стандартных модулей является, то что модули класса могут включают два необязательных метода с предопределенными именами – Class_Initialize() и Class_Terminate(), которые автоматически выполняются при создании и уничтожении объекта данного класса.
Для использования функциональности класса необходимо создать хотя бы один экземпляр класса, то есть объект класса. Для этого необходимо объявить объектную переменную, которая используется для хранения начального адреса объекта в памяти программы. Фактически объектная переменная представляет собой указатель, подобный указателям в языках программирования С/С++ и OP. Однако в VBв отличие от других языков программирования настоящего значение указателя не раскрывается, а также отсутствует возможность создавать указатели скалярных и структурных типов, соответственно невозможны адресные операции.
Объектные переменные могут быть описаны с помощью ключевых слов DIM, PUBLIC и PRIVATE. Например:
Dim objMessage As CMessage
Объявление объектной переменной (как и всякого указателя), в отличие от переменной скалярного или простого структурного типа не означает создание самого объекта, т.е. выделения для него памяти в динамической области программы. Объявление объектной переменной означает лишь резервирование ячейки памяти для адреса начала объекта в памяти. Для конструирования же самого объекта, то есть размещения в памяти полей (переменных) и методов объекта, в VB имеется специальный оператор NEW. Действие этого оператора заключается в том, что он распределяет память и размещает в ней поля и методы создаваемого объекта, а также возвращает адрес начала объекта в памяти.
Созданный с помощью оператора NEW объект, должен быть присоединен к соответствующей объектной переменной с помощью особого оператора присваивания SET, который позволяет присвоить объектной переменной адрес, возвращаемый оператором NEW.
Set objMessage = New CMessage
Поля созданного объекта принадлежат только этому объекту, тогда как методы – разделяются всеми созданными в программе объектами этого типа (рис. 15). По этому адресу хранящемуся в объектной переменной располагаются поля данного экземпляра класса и ссылка на таблицы, содержащая адреса методов, которые, как уже отмечалось принадлежат классу в целом.
Таким образом, после назначения объектной переменной адреса реального сконструированного объекта в динамической памяти, посредством этой объектной переменной становятся доступными методы и свойства объекта класса.
Для доступа к членам класса используется специальный оператор, подобный оператору доступа к полю записи (пользовательского, структурного типа). Этот оператор получил название селектора члена класса(member selector) и синтаксически представлен символом «.».
Например, для использования объекта в рассматриваемом примере необходим следующий код:
Public Sub UseObject ()
Dim objMessage As CMessage
Set objMessage = New CMessage
objMessage.Msg = "Hello world"
objMessage.ShowMessage
End Sub
VB имеет возможность создавать несколько указателей на один и тот же объект, в виде нескольких объектных переменных:
Dim objMsgFirst As CMessage // первая объектная переменная
Dim objMsgSecond As CMessage // вторая объектная переменная
Set objMsgFirst = New CMessage // создаем первый объект
// второй объектной переменной присваиваем ссылку
// на первый объект
Set objMsgSecond = objMsgFirst
Для сравнения двух указателей в VBимеется специальный операторIS, который позволяет определить указывают ли две объектных переменных на один и тот же объект:
If objMsgFirst Is objMsgSecond then
MsgBox "Объектные переменные указывают на один объект"
End if

Рис. 15. Ссылочная природа объектов
В VBобъект существует до тех пор пока на него имеется хотя бы одна ссылка, то есть хотя бы одна используемая объектная переменная, которая находится в области видимости и время «жизни», которой не истекло. Сама ссылка, т.е. объектная переменная, разрушается когда она выходит из области видимости. Кроме того, можно явно разорвать связь между указателем и объектом, на который он указывает, присвоив объектной переменной значение специальной константыNOTHING:
Set objCommentSecond = Nothing
Однако разрыв связи объекта с одной объектной переменой не означает уничтожение объекта, если имеется хотя бы еще одна ссылка на объект.
