Классы и объекты
Давайте рассмотрим работу с классами на примере класса Person.
Пример 20.1. Создание класса Person.
- Insert › Class Module
- Properties Name: = Person
Программа 20.21. Создание класса.
Public
name
As
String
Private
birthday
As
Date
Private
male
As
Boolean
Public
Sub
perslnit(
Optional
persName
As
String
=
"Novikov"
,
Optional
persBirth
As
Date
= #10/10/511,
Optional
persMale
As
Boolean
=
True
)
name = persName birthday = persBirth male = persMale
End
Sub
Public
Sub
persPrint()
Dim
str
As
String
str =
"Person name is "
& name & Chr(13) & Ilf(male,
"He"
,
"She"
) &
" was born in "
& birthday
MsgBox(str)
End
Sub
Перед тем как перейти к описанию синтаксиса объявления объектов класса, мы хотели бы обратить внимание на внутренний процесс их создания. Вообще, объект – это переменная, поэтому, когда он создается, для него выделяется необходимая память (ее размер зависит от типов свойств класса), а имя объекта ссылается на адрес памяти, где расположен объект. А теперь небольшой фокус, невозможный для переменных простых типов. В VBA есть возможность создания только ссылки на объект без фактического его присутствия. Подобная ссылка указывает адрес памяти, где будет храниться объект. Синтаксис объявления ссылок на объект не отличается от объявления простых переменных:
{
Dim
|
Private
|
Public
} имяОбъекта
As
Object
Если вы обратитесь к таблице встроенных типов (табл. 20.4), то увидите, что для переменных данного типа отводится 4 байта, ровно столько, сколько необходимо для хранения адреса памяти. Конечно, ссылка сама по себе бессмысленна и ее, в конце концов, необходимо будет связать с реально существующим объектом посредством оператора присваивания set, но до этого нужно объявить объект. Синтаксис объявления объектов, класс которых определен пользователем, прост:
{
Dim
|
Private
|
Public
|
Static
} имяОбъекта
As
[
New
] имяКласса
Спецификатор New указывает компилятору, что создается новый объект и под него необходимо выделить память. Использование оператора set позволяет связывать ссылку с реальным объектом:
Set
ИмяОбъекта = {[
New
] объектноеВыраженме |
Nothing
}
Где имяОбъекта и объктноеВыражение – это ссылки на объект. Таким образом, ссылке слева присваивается значение ссылки справа. Спецификатор Nothing разрывает установленное значение ссылки. Связывание с использованием оператора New называется ранним, с использованием ссылок на объект – поздним.
Рассмотрим объявление объектов класса Person. Сначала создается объект author. Далее посредством метода класса persinit инициализируются свойства объекта: имя, дата рождения и пол. После чего объявляется ссылка на объект, а потом происходит присваивание ссылке he значения ссылки author и в качестве подтверждения того, что все связалось верно, производится вывод свойств объекта he посредством метода persPrint.
Программа 20.22. Объявление объектов класса, определенного пользователем.
Sub
ObjectExample()
Dim
author
As
New
Person
Dim
he
As
Object
author.perslnit
"Novikov"
, #10.10.51*
Set
he = author
he.persPrint
End
Sub
После объявления объектов, определенных пользователем, уместно рассказать об объявлении нового класса на основе уже созданного. Как мы говорили выше, для этого предусмотрен механизм встраивания объектов родительского класса в новый класс. Таким образом, объект класса родителя становится значением свойства класса потомка. Но объявление такого свойства синтаксически выглядит как объявление объекта класса. Продемонстрируем встраивание классов на примере создания нового класса Book. Для этого сначала проделаем стандартную процедуру создания нового модуля класса и присваивания ему имени Book. Потом встроим объект author класса Person и добавим свойство title и два метода booklnit и bookPrint.
Метод bookinit инициализирует объект класса Book, в качестве параметров этот метод получает строку для инициализации свойства title и ссылку на объект класса Person для инициализации свойства author.
Программа 20.23. Встраивание классов.
Dim
author
As
New
Person
Private
title
As
String
Public
Sub
booklnit(str
As
String
, persObject
As
Person)
title = str
Set
author = persObject
End
Sub
Public
Sub
bookPrint()
Dim
str
As
String
str =
"Book title is "
& title & Chr(13) &
"Written by "
& author.name
MsgBox(str)
End
Sub