Свойства модуля класса
Несмотря на то, что свойства класса могут быть реализованы как общедоступные переменные, для доступа к ним Visual Basic предоставляет процедуры Property Let и Property Get. Для корректной реализации свойства класса необходимо добавить следующие процедуры:
Private m_IntProperty
Public Property Let IntProperty(newValue As Integer)
m_IntProperty = newValue
End Property
Public Property Get IntProperty() Аs Integer
IntProperty = m_IntProperty
End Property
Закрытая переменная m_IntProperty - это локальная копия значения свойства. Каждый раз, когда приложение устанавливает значение этого свойства, автоматически вызывается процедура Property Let и новое значение используется в качестве аргумента. Другими словами, строка
IntProperty = 100
вызывает следующую процедуру класса:
Property Let IntProperty(100)
Назначение свойству некоторого значения приводит к вызову процедуры Property Let (имеющую то же имя, что и свойство). Код процедуры может проверить новое значение на допустимость и либо принять его (и присвоить его значение локальной переменной), или отвергнуть. Аналогично, когда приложение запрашивает значение свойства IntProperty, передается значение локальной переменной m_IntProperty.
В процедуру Property Let можно добавить любой необходимый код проверки корректности значения. Например, свойство Age (Возраст) может быть реализовано следующим кодом:
Private m_Age
Public Property Let Age(newValue As Integer)
Select Case newValue
Case < 0: m_Age = 0
Case > 100 : m_Age = 100
Else m Age = newValue
End Select
End Property
Public Property Get Age() As Integer
IntProperty = m_Age
End Property
Если в приложении определено неверное значение возраста, класс выполняет некоторые действия, которые впоследствии предотвращают серьезные ошибки. Объем программного кода проверки зависит от природы свойства, а его можно добавить столько, сколько будет необходимо.
Можно также принудительно вызвать ошибку изнутри процедуры Property Let, которая может быть обработана кодом приложения. Например, можно так реализовать свойство Age:
Public Property Let Age(newValue As Integer)
If newValue < 0 or newValue > 100 Then
Err.Raise 1999, _
" Invalid Age. It must be greater than zero _
and less than 100"
' (Неверное значение. Возраст должен быть больше ' нуля и меньше 100)
Else
m_Age = newValue
End Property
Ошибка возвращается приложению, которое либо генерирует ошибку времени выполнения, либо обрабатывает ее.
Можно подумать об отображении сообщения с помощью функции MessageBox() внутри кода процедуры. Но это не очень хорошо по двум причинам.
1. Окно сообщения может не отображаться на мониторе пользователя. Если класс находится на сервере и используется приложением удаленно посредством сети (или Internet), окно сообщения будет отображено на сервере, а не на компьютере клиента. Так как пользователь приложения не видит окно сообщения, у него нет возможности нажать кнопку ОК. и, как результат, приложение зависнет.
2. Так как ошибка генерируется не кодом приложения, то нельзя выдать пользователю действительно точную информацию об ошибке. Возможно только общее сообщение типа "Пожалуйста, введите правильное значение". Это действие должно выполняться кодом приложения, и лучший способ реагирования на ошибки в классах - это выявить ошибки в вызывающем приложении и предоставить их обработку этому приложению.
Тем не менее, есть возможность отображать окна сообщений из кода класса или даже вывести всю форму или диалоговое окно с запросом к пользователю о вводе данных. Следует только помнить, что видимый интерфейс класса может стать невидимым, если класс выполняется удаленно.
Некоторые классы предоставляют свойства только для чтения. Самый простой способ реализации свойства только для чтения - опустить процедуру Property Let, как это было сделано с классом CTimer. Можно также инициировать ошибку времени выполнения, которую приложение может перехватить и действовать соответственно. Как вызвать ошибки внутри класса, описано далее в этой главе.