Вычисляемые свойства, свойства только для чтения.


Процедуры Property можно использовать на уровне форм, стандартных модулей и модулей класса. То есть такие процедуры должны быть использованы вместо Public переменных, если требуется выполнить некоторые действия в тот момент, когда устанавливается значение этой переменной. В отличие от Public переменной Property процедуры могут иметь текст подсказки. Три варианта процедур обеспечивают следующее: Property Let – присваивание значения свойству, Property Get – возвращает значение свойства, Property Set устанавливает ссылку на объект.

Попытаемся разобраться, зачем они нужны. В объектно-ориентированном программировании достаточно тонка грань между методами и свойствами. Предполагается, что метод отражает некоторое действие. Но вдумайтесь, зачем пользователю Вашего объекта знать, что Вы написали программу, которая вычисляет значение некоторого свойства, а не храните это значение прямо в объекте? Рассмотрим пример. Пусть Вы описали объект "работник" и задали внешнее свойство "средняя заработная плата". Пользователь Вашего класса имеет возможность использовать это свойство. А Вы стоите перед выбором: то ли хранить его и пытаться поддерживать его актуальность, то ли вычислять при каждом обращении к нему. Вариант с периодическим перевычислением, состоящий в том, что, например, в начале каждого месяца запускается программа, которая пересчитывает среднюю зарплату для всех, не эффективен, поскольку, вероятно, никто не запросит среднюю зарплату для всех. Выполнять всегда пересчет при запросе тоже не очень хорошо при условии, что в течение месяца может быть неоднократное обращение к средней зарплаты некоторого работника, хотя последняя остается, очевидно, неизменной. Вероятно, наилучшим решением будет применение конструкции property get. Ваши вычисления будут скрыты от пользователя класса, к тому же вы сможете организовать дело наиболее эффективным способом.

Вставьте в проект модуль класса, назовите его worker (работник). В модуле класса опишите два скрытых от пользователя класса свойства и доступную процедуру.

Dim sr As Single, dt As Date

Public Property Get s_ZP() As Single

If Month(dt) < Month(Date) Then

‘здесь расчет средней з/п

dt = Date - (Day(Date) - 1)

End If

s_ZP = sr

End Property

В некоторой прикладной программе будет обращение к свойству s_ZP.

Dim ob As woker

MsgBox ob.s_ZP

Еще одна причина использования процедур Property: процедуры могут быть использованы для создания свойств "только для чтения". Подумайте, если вам требуется скрыть некоторое свойство объекта, вы его описываете как Private, если вы хотите предоставить пользователю класса некоторое свойство, вы его описываете как Public. Но при помощи этих описателей нет возможности создать видимое, но не изменяемое свойство. А с помощью процедур Property это сделать несложно: достаточно для некоторого свойства описать Property Get и не описывать процедуру Property Let! Впрочем, можно ее описать, но в ней вежливо уведомить пользователя о недопустимости изменения данного свойства.