Property
声明构成Property过程主体的名称、参数和代码:获取属性值、为属性赋值或设置对象属性引用的过程。
属性通过最多三个属性过程向调用者公开,这些过程在同一模块中共享相同的name:
- Property Get过程返回属性的值(或对象引用)。
- Property Let过程为属性赋非对象值。
- Property Set过程为属性赋对象引用。
语法:
[ attributes ]
[ Public | Private | Friend | Protected ] [ Static ] [ Overridable ] Property Get name [ ( Of typevars ) ] [ ( arglist ) ] [ As type ] [ binding-clause ]
[ statements ] ...
[ [ Let ] name = expression ] ...
[ Set name = expression ] ...
[ Return expression ] ...
[ Exit Property ] ...
[ statements ] ...
End Property[ attributes ]
[ Public | Private | Friend | Protected ] [ Static ] [ Overridable ] Property Let name [ ( Of typevars ) ] ( [ arglist , ] value ) [ binding-clause ]
[ statements ] ...
[ Exit Property ] ...
[ statements ] ...
End Property[ attributes ]
[ Public | Private | Friend | Protected ] [ Static ] [ Overridable ] Property Set name [ ( Of typevars ) ] ( [ arglist , ] reference ) [ binding-clause ]
[ statements ] ...
[ Exit Property ] ...
[ statements ] ...
End Property
- attributes
可选 过程的一个或多个受支持属性。
- Public
可选 指示Property过程可被所有模块中的所有其他过程访问。如果在包含Option Private语句的模块中使用,则该过程在项目外不可用。
- Private
可选 指示Property过程仅在其声明的模块中的其他过程可访问。
- Friend
可选 仅在类模块中使用。指示Property过程在整个项目中可见,但对对象实例的控制器不可见。
- Protected
可选 (twinBASIC) 仅在类中使用。指示Property过程可从声明类的内部和通过Inherits派生的类中访问,但外部调用者不能访问。同一属性的三个访问器形式(Get、Let、Set)应在访问修饰符上保持一致。
- Static
可选 指示Property过程的局部变量在调用之间保留。Static属性不影响在Property过程外部声明的变量,即使它们在过程中被使用。
- Overridable
可选 (twinBASIC) 将Property标记为继承钩子,通过Inherits派生的类可以用Overrides子句替换。仅在参与Inherits层次结构的类成员上有意义。
- name
Property过程的名称;遵循标准变量命名约定,但同一模块中匹配的Property Get、Property Let和Property Set过程共享相同的名称。
- Of typevars
可选 一个或多个类型变量名称,遵循标准变量命名约定。名称以逗号分隔。使过程成为泛型Property过程。匹配的Property Get、Property Let和Property Set过程必须声明相同的泛型参数。
- arglist
表示调用Property过程时传递参数的变量列表。多个参数以逗号分隔。Property Let或Property Set过程中每个参数的名称和数据类型必须与匹配的Property Get过程中对应参数相同。语法见下面的arglist。arglist对Property Get是可选的;对于Property Let和Property Set,至少需要value/reference参数。
- As type
可选 Property Get过程返回值的数据类型;可以是Byte、Boolean、Integer、Long、Currency、Single、Double、Decimal、Date、String(定长除外)、Object、Variant、用户自定义类型或数组。Property Get过程的返回type必须与对应Property Let过程的value参数(如果存在)的数据类型相同,或与对应Property Set过程的reference参数兼容。
- statements
可选 在Property过程主体中执行的任何语句组。
- expression
可选 在Property Get中,过程返回的值(或用Set赋值时的引用)。
- value
在Property Let中,包含要赋给属性值的变量。调用过程时,此参数出现在调用表达式的右侧。value的数据类型必须与对应Property Get过程的返回类型相同。value不能为Optional或ParamArray。
- reference
在Property Set中,包含对象引用赋值右侧使用的对象引用的变量。reference不能为Optional。
- binding-clause
可选 (twinBASIC) 三种尾随子句之一,将此访问器绑定到在其他地方声明的成员:
- Handles object.event [ , object.event … ]——将属性连接为命名事件的处理程序,取代传统的
Object_Event命名约定。参见Handles语句。 - Implements iface.member [ , iface2.member2 … ]——为命名的Interface(或Class)成员提供主体,取代传统的
Iface_Member命名约定。逗号分隔列表允许一个主体同时满足多个接口的成员。参见Implements语句。 - Overrides base.member——为通过Inherits继承的Overridable member提供主体。与同一标题上的Overridable组合可允许更深层派生类再次覆盖。
- Handles object.event [ , object.event … ]——将属性连接为命名事件的处理程序,取代传统的
- Exit Property
可选 立即从Property过程返回而不设置返回值。在Property Get、Property Let和Property Set中有效。
- Return expression
可选 仅在Property Get过程中有效。立即从过程返回并以expression作为属性值。此形式中expression是必需的;裸Return保留给GoSub...Return构造,不会退出Property过程。
arglist
语法:一个或多个
[ Optional ] [ ByVal | ByRef ] [ ParamArray ] varname [ () ] [ As type ] [ = defaultvalue ]
- Optional
- 可选 指示参数不是必需的。如果使用,arglist中后续的所有参数也必须是可选的,并使用Optional关键字声明。Property Let或Property Set调用的右侧(value或reference参数)不能为Optional。
- ByVal
- 可选 指示参数按值传递。
- ByRef
- 可选 指示参数按引用传递。与Visual Basic .NET不同,ByRef是默认的。
- ParamArray
- 可选 指示参数是Variant元素的Optional数组。ParamArray关键字允许传递任意数量的参数。不能与ByVal、ByRef或Optional一起使用,也不能作为Property Let或Property Set过程的value/reference参数。
- varname
- 表示参数的变量名称;遵循标准变量命名约定。
- type
- 可选 传递给过程的参数的数据类型;可以是Byte、Boolean、Integer、Long、Currency、Single、Double、Decimal、Date、String(仅变长)、Object、Variant、特定对象类型或泛型类型参数的名称。如果参数不是Optional,也可以指定用户自定义类型。
如果使用泛型类型参数的名称,它将绑定到传递给过程的参数的具体类型。名称绑定的作用域为过程主体。 - defaultvalue
- 可选 任何常量或常量表达式。仅对Optional参数有效。如果类型为Object,则显式默认值只能为Nothing。
如果未使用Public、Private或Friend显式指定,Property过程默认为公共的。如果未使用Static,局部变量的值在调用之间不保留。
Friend关键字只能在类模块中使用。但是,Friend过程可被项目中任何模块的过程访问。Friend过程不出现在其父类的类型库中,也不能被后期绑定。
所有可执行代码必须在过程中。Property过程不能在另一个**Property、Sub或Function**过程内部定义。
Exit Property语句,以及Return expression语句(仅在Property Get中),导致从Property过程立即退出。程序执行继续到调用Property过程的语句之后的语句。这些语句可以出现在Property过程中的任何位置,数量不限。
与Sub和Function过程类似,Property过程是一个独立的过程,可以接受参数、执行一系列语句并更改其参数的值。Property Get过程可以像Function或属性名一样用在表达式的右侧。Property Let过程只能用在属性赋值表达式或Let语句的左侧。Property Set过程只能用在对象引用赋值或**Set**语句的左侧。
示例
本示例使用Property语句定义一个PenColor属性:一个接受颜色名字符串并存储数字代码的Property Let,以及一个从存储的数字代码返回颜色名的Property Get。
Dim CurrentColor As Integer
Const BLACK = 0, RED = 1, GREEN = 2, BLUE = 3
' Set the pen color property for a Drawing package.
' The module-level variable CurrentColor is set to
' a numeric value that identifies the color used for drawing.
Property Let PenColor(ColorName As String)
Select Case ColorName ' Check color name string.
Case "Red"
CurrentColor = RED ' Assign value for Red.
Case "Green"
CurrentColor = GREEN ' Assign value for Green.
Case "Blue"
CurrentColor = BLUE ' Assign value for Blue.
Case Else
CurrentColor = BLACK ' Assign default value.
End Select
End Property
' Returns the current color of the pen as a string.
Property Get PenColor() As String
Select Case CurrentColor
Case RED: PenColor = "Red"
Case GREEN: PenColor = "Green"
Case BLUE: PenColor = "Blue"
End Select
End Property
' Calling code:
PenColor = "Red" ' Calls Property Let.
ColorName = PenColor ' Calls Property Get.Property Set过程赋值对象引用,方式与Property Let赋值非常类似:
' The Pen property may be set to different Pen implementations.
Property Set Pen(P As Object)
Set CurrentPen = P ' Assign Pen to object.
End Property