我正在尝试创建一个具有多个属性的类,这些属性由传递给该属性的相同数字索引。我尝试了几种代码配置,我最近的失败是:
'dataTypeClass class module
Private ap() As String
Private dt() As String
Public Property Get apos(index As Long) As Variant
Set apos = ap(index)
End Property
Public Property Get dataType(index As Long) As Variant
Set dataType = dt(index)
End Property
Public Property Let apos(index As Long, apVal As String)
ap(index) = apVal
End Property
Public Property Let dataType(index As Long, dtVal As String)
dt(index) = dtVal
End Property
我主要得到此错误代码:
期望在下面的子项中使用第一项的“ INT”和“”。
Sub classTest()
Dim d As New dataTypeClass
d(1).dataType = "INT"
d(1).apos = ""
Debug.Print d(1).dataType & d(1).apos
End Sub
我做错了几件事?
编辑:
采取以下建议(例如,编辑问题而不是发表评论),我将变体设置为字符串,并使用let
代替set
。由于确实确实超出了下标范围,因此需要初始化该类,但是是否需要redim index
?如果每次运行脚本时索引的最大值都不同,该怎么办?
答案 0 :(得分:5)
apos
属性 1 在指定的Variant
处获得index
;该实现建议封装的ap(index)
是Object
,因此返回类型可能应该是Object
而不是Variant
:
Public Property Get apos(index As Long) As Variant
Set apos = ap(index)
End Property
设置器使用Let
分配,该分配有点杂乱,但鉴于值为Variant
是允许的-哦,不,它是String
!
Public Property Let apos(index As Long, apVal As String)
ap(index) = apVal
End Property
您收到此错误是因为,如错误所述,属性定义不一致。如果ap(index)
是String
,则吸气剂应如下所示:
Public Property Get apos(index As Long) As String
apos = ap(index)
End Property
如果ap(index)
是Object
,则设置者应该看起来像这样:
Public Property Set apos(index As Long, apVal As Object)
Set ap(index) = apVal
End Property
...和这样的吸气剂:
Public Property Get apos(index As Long) As Object
Set apos = ap(index)
End Property
或者这样:
Public Property Get apos(index As Long) As Variant
Set apos = ap(index)
End Property
Public Property Set apos(index As Long, apVal As Variant)
Set ap(index) = apVal
End Property
换句话说:
Property Let
/ Property Set
的RHS / value参数必须与同名Property Get
成员的返回类型相同。Property Set
进行分配。Property Let
进行赋值。Variant
。Set
分配对象引用以外的任何内容。 1 dataType
属性的所有情况也是如此。
答案 1 :(得分:4)
对于Get的返回类型,您有一个变体,但Let的其他参数正在使用字符串。也许您需要dtVal As Variant
?如评论和其他答案中所述,还有其他需要考虑的事项;有些将针对具体实现。
Property Get,Property Let和Property的参数 相同属性的Setprocedures必须完全匹配,除了 属性Let具有一个额外的参数,其类型必须与return匹配 相应的属性Get的类型,并且属性集有一个 参数比相应的属性Get多,其类型为 Variant,Object,类名或对象库类型 在对象库中指定。此错误有以下原因 和解决方案:
Property Get过程的参数数量不少于 比匹配的属性Let或 属性设置过程。向Property Let或Property添加参数 视情况从Property Get中设置或删除参数。
Property Get的参数类型必须与 Property Let或Property Set的相应参数,除了 额外的属性集参数。修改中的参数声明 相应的过程定义,因此它们是适当的 匹配。
属性Let的附加参数的参数类型必须 与相应的Property Get过程的返回类型匹配。 修改“ Property Let”中的额外参数声明或 相应属性Get的返回类型,因此它们是 适当匹配。
属性集的额外参数的参数类型可以 与相应的属性Get的返回类型不同,但是 必须是Variant,Object,类名或有效的对象库 类型。
确保“属性设置”过程的额外参数为 变量,对象,类名或对象库类型。
您使用Optional或ParamArray定义了Property过程 参数。不允许在其中使用ParamArray和Optional参数 财产程序。重新定义过程,无需使用 这些关键字。