【发布时间】:2011-06-29 20:49:01
【问题描述】:
我刚刚创建了几个Property Set 方法,但它们没有编译。当我将它们更改为Property Let 时,一切都很好。
此后我研究了文档以找出Property Set 和Property Let 之间的区别,但我必须承认自己并不聪明。有什么区别吗,如果有的话,有人可以提供一个正确解释的指针吗?
【问题讨论】:
标签: oop properties vb6 setter letter
我刚刚创建了几个Property Set 方法,但它们没有编译。当我将它们更改为Property Let 时,一切都很好。
此后我研究了文档以找出Property Set 和Property Let 之间的区别,但我必须承认自己并不聪明。有什么区别吗,如果有的话,有人可以提供一个正确解释的指针吗?
【问题讨论】:
标签: oop properties vb6 setter letter
Property Set 用于对象(例如,类实例)
Property Let 用于“普通”数据类型(例如,字符串、布尔值、长整数等)
【讨论】:
Property Get 用于将对象引用作为属性返回,而不是 Property Set。
Function 和Property Get 过程一样,Property Set 过程是一个单独的过程,它可以接受参数、执行一系列语句并更改其参数的值. 但是,与Function 和Property Get 过程不同,它们都返回一个值,您只能在对象引用赋值的左侧使用Property Set 过程(Set 语句)。
Property Set 定义了一个可以在Set 语句的左侧使用的属性。我确实认为提到WithEvents 有点令人困惑,但它与解释差异并没有真正的关系。 Property Set 可用于可在运行时动态更改的对象之间的 1:1 关系,即超出 WithEvents。
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 和 Property Let 作为对象类型,并假设实现代码相同(如您的示例中),VB6 是否有任何内置差异当开发人员调用任一属性时,实际上会这样做吗?例如,如果开发人员调用Let 属性,VB6 是否会隐式决定突然按值而不是按引用传递对象,还是有任何其他类似的细微差别? (我知道你说你喜欢写的那些有不同的语义,但我不确定语言本身是否有什么不同。)
ByVal oValue As StdPicture 与 ByRef oValue As StdPicture 会改变对象 reference 的传递方式。就像 C/C++ 中的 StdPicture *oValue 与 StdPicture **oValue 一样——总是指针,但在第二种情况下,可以在过程中更改 reference (例如,将 ref 分配给新对象)和调用者可以收到这个新的引用。所以本身没有“复制”选项,我通常在Property Let 内部使用Clone 方法(例如在IFont 接口上)来手动实现“深度复制”语义。
Property Set 用于类对象变量 (ByRef) 而Property Let 用于类值变量 (ByVal)
【讨论】:
Property Get 与返回任何其他类属性相同(没有返回类属性的对象特定版本)。