Классы и объекты
Но вернемся к методу bkPrint класса Book. Сейчас он не работает, поскольку обращение author.name стало бессмысленным. Для правильной работы метода необходимо заменить строку с неправильным оператором на следующую:
str =
"Book title is "
& title & Chr(13) & _
"Written by "
& author.prsName
Таким образом, дойдя до данной строки кода, программа выполнит процедуру-свойство объекта author, т. е. prsName, которая возвращает текущее значения свойства name.
После описания процедур-свойств перейдем к заключительному аккорду в рассмотрении процедур класса: к процедурам реакции на событие. Выше мы уже упоминали о них. Напомним, что тогда мы приводили пример процедуры реакции на событие Document_ciose (реакция на событие "Закрыть документ"). Как мы упоминали, существует множество событий и множество процедур реакции на них. Но помимо встроенных процедур, пользователь вправе создавать собственные обработчики событий.
Чтобы пояснить сказанное, рассмотрим типовой сценарий жизни объекта от объявления до удаления:
- Вход в процедуру для работы с объектом.
- Создание ссылки на объект.
- Создание нового объекта.
- Работа с объектом.
- Выход из процедуры.
Прокомментируем этот сценарий. Для человеческого глаза нет ничего особенного в этой быстротечной жизни, а для системного "всевидящего ока" произошло два очень важных события: создание объекта и его удаление (при выходе из процедуры). Более того, мы не заметили, как были выполнены две процедуры реакции на эти события: initialize и Terminate, которые, соответственно, проинициализировали и уничтожили объект. Рассмотрим их подробнее.
Когда создается объект, вызывается процедура initialize, которая всем свойствам объекта присваивает значения, определенные для них по умолчанию. Данная процедура называется конструктором. Пользователь вправе изменить эту процедуру, указав, как инициализировать свойства объекта при его непосредственном объявлении.
Когда же объект выходит из области своего действия, например из процедуры, в которой он был локально объявлен, автоматически вызывается процедура Terminate, которая освобождает память, занимаемую объектом и ссылкой на него. Эту процедуру называют деструктором. Пользователь вправе и здесь изменить процедуру, но на практике этой возможностью пользуются очень редко.
Покажем использование процедур реакции на событие на примере класса Person. Мы ввели конструктор, инициализирующий свойства name, birthday и male.
Программа 20.28. Объявление процедур реакций на событие.
Private
Sub
Class_Initialize()
name =
"Novikov"
birthday = #10/10/1951#
male =
True
End
Sub
Конечно, это только первичная инициализация, для последующих инициализаций необходимо написать собственный конструктор. В нашем классе Person роль такого конструктора играет метод persinit.
Поздравляем: класс полностью готов к работе! Теперь вы можете использовать его возможности на полную мощность и ощутить всю прелесть ООП.
Попытайтесь самостоятельно встроить в наш класс Person еще несколько свойств и методов, а потом реализовать их.
На этом мы заканчиваем описание классов в VBA. Надеемся, что все описанные выше конструкции и примеры достаточно просты и понятны. Единственное, чему еще хотелось бы уделить особое внимание, – это семейство (collection), структура (класс) VBA, стоящая несколько в стороне от канонического описания, но тем не менее очень важная при реализации ряда задач, а также очень часто используемая в объектной модели Microsoft Office XP.