Visual Basic 6. Руководство разработчика

       

Свойства модуля класса


Несмотря на то, что свойства класса могут быть реализованы как общедос­тупные переменные, для доступа к ним 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. Можно также инициировать ошибку времени выполнения, которую приложение может перехватить и действовать соот­ветственно. Как вызвать ошибки внутри класса, описано далее в этой главе.

Содержание раздела