После объявления объектов

После объявления объектов, определенных пользователем, уместно рассказать об объявлении нового класса на основе уже созданного. Как мы говорили выше, для этого предусмотрен механизм встраивания объектов родительского класса в новый класс. Таким образом, объект класса родителя становится значением свойства класса потомка. Но объявление такого свойства синтаксически выглядит как объявление объекта класса. Продемонстрируем встраивание классов на примере создания нового класса Book. Для этого сначала проделаем стандартную процедуру создания нового модуля класса и присваивания ему имени Book. Потом встроим объект author класса Person И добавим СВОЙСТВО title И Два метода booklnit И bookPrint.
Метод bookinit инициализирует объект класса Book, в качестве параметров этот метод получает строку для инициализации свойства title и ссылку на объект класса Person для инициализации свойства author.
Встраивание классов
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
Покажем использование объектов класса Book, изменив код программы следующим образом:
Использование объектов встроенных классов
Sub ObjectExample()
Dim author As New Person
Dim bookObj As New Book
author.perslnit "Novikov", #10/10/1951#
Эта функция также возвращает ссылку на объект ActiveX. Только в этом случае в качестве параметров выступает путь, который указывает полный путь к файлу с объектом. Второй параметр при этом не обязателен.
В нижеприведенной программе мы открываем документ Word двумя разными функциями.
Открытие документа
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:\of200l\62\62.doc") End Sub
Выше мы рассмотрели вопросы объявления класса и использования его объектов вообще. Теперь же перейдем к изучению внутреннего устройства и организации класса более детально, а именно рассмотрим виды процедур класса и их работу со свойствами класса.
В VBA все процедуры класса делятся на три группы:
1. Процедуры-методы.
2. Процедуры-свойства.
3. Процедуры — реакции на событие.
Синтаксис объявления процедур-методов не отличается от стандартного, за исключением возможного использования ключевого слова Friend, о котором говорилось в "Структура программы". Настала пора детально рассмотреть возможность его употребления. Ключевое слово Friend, как и ключевые слова Private и Public, предназначено для ограничения области видимости метода. Если Private делает метод видимым только внутри модуля, a Public — для всех модулей всех проектов, то Friend занимает промежуточную позицию между ними, он делает видимым метод только в том проекте, где был описан класс.
Как известно, определение класса в VBA состоит из двух разделов: реализации и интерфейса. Одна из наиболее трудных задач для программистов-новичков в ООП заключается в определении того, какие члены класса делать закрытыми (включать в раздел реализации), а какие, наоборот, открытыми (включать в раздел интерфейса). Общим правилом можно считать, что
чем меньше программе известно о реализации класса, тем лучше. То есть желательно скрыть посредством ключевого слова Private как можно большее количество свойств класса в разделе реализации, а доступ к свойствам осуществлять через специальные открытые методы (Public), организующие интерфейс класса.
Замечание
Сокрытие информации — это сокрытие деталей реализации функций, класса или даже программы. В условиях сокрытия информации программист работает с функциями и классами, как с черными ящиками. Другими словами, передавая функции некоторое значение в форме входного параметра, программист знает лишь результат, который будет получен на выходе этой функции. Сокрытие информации в реализационную часть класса и доступ к ней через функциональный интерфейс повышают надежность программы.
Например, предположим, что свойство birthday класса Person может принимать значения только в диапазоне от 1900 до 2000. Если это свойство объявлено как Public, то ему можно присвоить недопустимые значения: writer.birthday = #31/12/1899#. Ограничение видимости свойства и использование метода Public дает возможность проверки присваиваемых значений:
Public Sub InitBirthday( bthday As Date)
If bthday > #l/l/1900# and bthday < fl/1/20001 Then
birthday = bthday Else
MsgBox ("You date is out of range") End If End Sub
Таким образом, употребление ключевого слова Public при объявлении свойства name в классе Person также оказывается некорректным. Но, если отменить глобальную видимость, то станет невозможным употребление функций, напрямую связанных с глобальными свойствами. Например, метод bkPrint класса Book окажется некорректным, т. к. уже нет доступа через author.name. Как же быть? Как тогда получить значение этого свойства?
В VBA предусмотрены специальные процедуры-свойства, которые предназначены для чтения и записи закрытых свойств:
Property Let
Процедура записи позволяет присваивать свойству новые значения
Property Set
Процедура записи позволяет присваивать свойству и свойству-ссылке новые значения. Отдельная процедура нужна, поскольку свойство-ссылка’указыва-ет на объект, а присваивание объектам отличается от присваивания переменным простых типов.
Property Get
Процедура чтения (а точнее функция) позволяет считывать значение свойства. Эта процедура применима как к простым свойствам, так и к свойствам-ссылкам.
Приведем синтаксис каждой из них:
[{Public | Private | Friend}] [Static] Property Let имяПроцедурыСвойства
([списокПараметров] значение)
[блокОператоров 1}
[Exit Property]
[блокОператоров2]
End Property
Синтаксис прост и понятен. Сначала идут операторы объявления видимости процедуры-свойства и необязательное ключевое слово static. Кстати, хотя использование ключевого слова private допустимо, его присутствие сводит на нет смысл процедуры-свойства.
ИмяПроцедурыСвойства — это имя процедуры, изменяющей свойство.
Совет
Желательно, чтобы имя повторялось во всех трех процедурах-свойствах, если они имеют дело с одним и тем же свойством.
СписокПараметров ,— это список дополнительных параметров, участвующих в процедуре. Синтаксис списка параметров абсолютно такой же, как и у списка в обыкновенной процедуре. Обратите внимание на то, что все три процедуры-свойства, имеющие одно и то же имя, обязаны иметь одинаковый список параметров.
Значение — это самый важный обязательный параметр, значение которого передается свойству.
Далее идет блокОпера торов, в котором следует произвести присваивание свойству значения фактического параметра значение.
Процедура Property Set имеет следующий синтаксис.
[{Public | Private | Friend}] [Static] Property Set имяПроцедурыСвойства ([списокПараметров] ссылкаНаОбъект) [блокОператоров 1] [Exit Property] [блокОператоров2] End Property
Здесь только одно отличие от предыдущей процедуры: вместо аргумента значение стоит аргумент ссылкаНаОбъект, который представляет имя ссылки на объект, присваиваемый свойству-ссылке.
Осталось рассмотреть функцию чтения значения свойства.
[{Public | Private | Friend}] [Static] Property Get имяПроцедурыСвойства ([списокПараметров]) As ТипДанных [блокОператоров1]
[имяПроцедурыСвойства = выражение] [Exit Property] [блокОператоров2] End Property
Как видно, Property Get — это функция, и для нее действуют все синтаксические правила функций. Напомним лишь одно: тип значения, возвращаемого функцией, должен совпадать с типом значения выражение.
Рассмотрим использование процедур-свойств на нашем примере класса
Person. Поскольку МЫ объявили свойства класса name, birthday И male 3акрытыми, введем процедуры-свойства для работы с ними. В примере отображена только одна пара для свойства birthday, для name и male все строится аналогично.