Классы и объекты
Покажем использование объектов класса Book, изменив код программы 20.22 следующим образом:
Программа 20.24. Использование объектов встроенных классов.
Sub
ObjectExample()
Dim
author
As
New
Person
Dim
bookObj
As
New
Book
author.perslnit
"Novikov"
, #10/10/1951#
Эта функция также возвращает ссылку на объект ActiveX. Только в этом случае в качестве параметров выступает путь, который указывает полный путь к файлу с объектом. Второй параметр при этом не обязателен.
В нижеприведенной программе мы открываем документ Word двумя разными функциями.
Программа 20.26. Открытие документа.
Sub
DocOpen1()
Dim
docObj
As
Object
Set
docObj = CreateObject(
"Word.Application"
)
docObj.Visible =
True
docObj.Documents.Add
БлокОператоров
docObj.Quit
End
Sub
Sub
DocOpen2()
Dim
docObj
As
Object
Set
docObj = GetObject(
"d:\of2001\62\62.doc"
)
End
Sub
Выше мы рассмотрели вопросы объявления класса и использования его объектов вообще. Теперь же перейдем к изучению внутреннего устройства и организации класса более детально, а именно рассмотрим виды процедур класса и их работу со свойствами класса.
В VBA все процедуры класса делятся на три группы:
- Процедуры-методы.
- Процедуры-свойства.
- Процедуры – реакции на событие.
Синтаксис объявления процедур-методов не отличается от стандартного, за исключением возможного использования ключевого слова Friend, о котором говорилось в разделе "Структура программы". Настала пора детально рассмотреть возможность его употребления. Ключевое слово Friend, как и ключевые слова Private и Public, предназначено для ограничения области видимости метода. Если Private делает метод видимым только внутри модуля, а Public – для всех модулей всех проектов, то Friend занимает промежуточную позицию между ними, он делает видимым метод только в том проекте, где был описан класс.
Как известно, определение класса в VBA состоит из двух разделов: реализации и интерфейса. Одна из наиболее трудных задач для программистов-новичков в ООП заключается в определении того, какие члены класса делать закрытыми (включать в раздел реализации), а какие, наоборот, открытыми (включать в раздел интерфейса). Общим правилом можно считать, что чем меньше программе известно о реализации класса, тем лучше. То есть желательно скрыть посредством ключевого слова Private как можно большее количество свойств класса в разделе реализации, а доступ к свойствам осуществлять через специальные открытые методы (Public), организующие интерфейс класса.
Замечание
Сокрытие информации – это сокрытие деталей реализации функций, класса или даже программы. В условиях сокрытия информации программист работает с функциями и классами, как с черными ящиками. Другими словами, передавая функции некоторое значение в форме входного параметра, программист знает лишь результат, который будет получен на выходе этой функции. Сокрытие информации в реализационную часть класса и доступ к ней через функциональный интерфейс повышают надежность программы.
Например, предположим, что свойство birthday класса Person может принимать значения только в диапазоне от 1900 до 2000. Если это свойство объявлено как Public, то ему можно присвоить недопустимые значения: writer.birthday = #31/12/1899#. Ограничение видимости свойства и использование метода Public дает возможность проверки присваиваемых значений:
Public
Sub
InitBirthday(bthday
As
Date
)
If
bthday > #1/1/1900# and bthday < #11/1/2001#
Then
birthday = bthday
Else
MsgBox(
"You date is out of range"
)
End
If
End
Sub
Таким образом, употребление ключевого слова Public при объявлении свойства name в классе Person также оказывается некорректным. Но, если отменить глобальную видимость, то станет невозможным употребление функций, напрямую связанных с глобальными свойствами. Например, метод bkPrint класса Book окажется некорректным, т. к. уже нет доступа через author.name. Как же быть? Как тогда получить значение этого свойства?