Иллюстрированный самоучитель по Microsoft Outlook 2002

Классы и объекты

Давайте рассмотрим работу с классами на примере класса 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
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.