Ответ 1
Property Set
для объектов (например, экземпляров класса)
Property Let
относится к "нормальным" типам данных (например, строка, логическая, длинная и т.д.)
Я только что создал несколько методов Property Set
, и они не компилировались. Когда я изменил их на Property Let
, все было в порядке.
С тех пор я изучил документацию, чтобы найти разницу между Property Set
и Property Let
, но должен признать, что она не является более мудрой. Есть ли разница, и может ли кто-нибудь предложить указатель на правильное объяснение этого?
Property Set
для объектов (например, экземпляров класса)
Property Let
относится к "нормальным" типам данных (например, строка, логическая, длинная и т.д.)
Property Let
более универсален, чем Property Set
. Последний ограничивается только ссылкой на объекты. Если у вас есть это свойство в классе
Private m_oPicture As StdPicture
Property Get Picture() As StdPicture
Set Picture = m_oPicture
End Property
Property Set Picture(oValue As StdPicture)
Set m_oPicture = oValue
End Property
Property Let Picture(oValue As StdPicture)
Set m_oPicture = oValue
End Property
Вы можете вызвать Property Set Picture
с помощью
Set oObj.Picture = Me.Picture
Вы можете вызвать Property Let Picture
с помощью
Let oObj.Picture = Me.Picture
oObj.Picture = Me.Picture
Реализация Property Set
- это то, что другие разработчики ожидают для свойств, которые являются объектными ссылками, но иногда даже Microsoft предоставляет только Property Let
для ссылочных свойств, что приводит к необычному синтаксису oObj.Object = MyObject
без оператора Set
. В этом случае использование оператора Set
приводит к ошибке компиляции или времени выполнения, поскольку в классе oObj
нет Property Set Object
.
Я стараюсь реализовать как Property Set
, так и Property Let
для свойств стандартных типов - шрифтов, изображений и т.д., но с другой семантикой. Обычно на Property Let
я имею тенденцию выполнять "глубокую копию", т.е. Клонирование StdFont
вместо просто ссылки на исходный объект.
Property Set
предназначен для объектноподобных переменных (ByRef), тогда как Property Let
для значений-подобных переменных (ByVal)