Class 属性 对象不支持

Class property not supported by object

我有一个 Class 的开头,它最终将用于创建、检查和删除检查文件。

根据我找到的资源,下面的代码似乎是正确的,但是当我 运行 它时,我在第 4 行出现错误 -

Object doesn't support this property or method: 'Names'

我做错了什么?

Dim CheckFile
Set CheckFile = new ManageCheckFile

Call CheckFile.Names("chkfile", Array("bucf", "id"), "20150618")

Class ManageCheckFile

    Private m_cfNames
    Private m_cfPrefix
    Private m_cfTypes
    Private m_cfDate

    '**
     ' Set the cfNames property
     ' Also set the cfPrefix, cfTypes and cfDate properties
     '*
    Public Property Let Names(prefix, types, date)

        m_cfPrefix = prefix
        m_cfTypes = types
        m_cfDate = date
        Dim i   ' Dummy for looping
        For i = 0 To UBound(m_cfTypes)
            m_cfNames(i) = m_cfPrefix & "-" & m_cfDate & "." & m_cfTypes(i)
        Next

    End Property

End Class

对于您正在做的事情,函数可能比 Class 更好地为您提供服务。如果你想要 return 任何东西,你都不想使用 Sub。 https://msdn.microsoft.com/en-us/library/bx9ceb2w%28v=vs.84%29.aspx

属性的使用方式与变量类似,尽管它们的定义方式与过程类似。您不能调用属性(Call 关键字仅适用于过程和函数)。相反,您可以像这样给它们赋值:

object.property = value

此外,VBScript 只允许将单个值分配给 属性。 属性 getter 和 setter 的其他参数用于索引访问。一个 属性 定义如下:

Property Let Foo(a, b, c)

必须这样使用:

object.Foo(valueA, valueB) = valueC

引自documentation

[Public | Private] Property Let name ([arglist,] value)
   [statements]
   [Exit Property] 
   [statements]
End Property

[...]

arglist

List of variables representing arguments that are passed to the Property Let procedure when it is called. Commas separate multiple arguments. The name of each argument in a Property Let procedure must be the same as the corresponding argument in a Property Get procedure. In addition, the Property Let procedure will always have one more argument than its corresponding Property Get procedure. That argument is the value being assigned to the property.

如果您必须将多个值分配给一个 属性,您需要将这些值包装在适当的数据结构中(数组、字典、自定义对象等)。示例:

Class ManageCheckFile
    Private m_cfNames
    Private m_cfPrefix
    Private m_cfTypes
    Private m_cfDate

    Public Property Let Names(data)
        m_cfPrefix = data("prefix")
        m_cfTypes  = data("types")
        m_cfDate   = data("date")

        Dim i
        ReDim m_cfNames(UBound(m_cfTypes))
        For i = 0 To UBound(m_cfTypes)
            m_cfNames(i) = m_cfPrefix & "-" & m_cfDate & "." & m_cfTypes(i)
        Next
    End Property
End Class

Set values = CreateObject("Scripting.Dictionary")
values.Add "prefix", "chkfile"
values.Add "types", Array("bucf", "id")
values.Add "date", "20150618"

Set CheckFile = New ManageCheckFile
CheckFile.Names = values

或者您使用实际方法填充多个成员变量:

Class ManageCheckFile
    Private m_cfNames
    Private m_cfPrefix
    Private m_cfTypes
    Private m_cfDate

    Public Sub Names(prefix, types, date)
        m_cfPrefix = prefix
        m_cfTypes  = types
        m_cfDate   = date

        Dim i
        ReDim m_cfNames(UBound(m_cfTypes))
        For i = 0 To UBound(m_cfTypes)
            m_cfNames(i) = m_cfPrefix & "-" & m_cfDate & "." & m_cfTypes(i)
        Next
    End Sub
End Class

Set CheckFile = New ManageCheckFile
CheckFile.Names "chkfile", Array("bucf", "id"), "20150618"

如果您将其设为 class 的默认方法并使其成为 return 对象,您可以(某种程度上)在对象创建后立即对其进行初始化:

Class ManageCheckFile
    Private m_cfNames
    Private m_cfPrefix
    Private m_cfTypes
    Private m_cfDate

    Public Default Function Names(prefix, types, date)
        m_cfPrefix = prefix
        m_cfTypes  = types
        m_cfDate   = date

        Dim i
        ReDim m_cfNames(UBound(m_cfTypes))
        For i = 0 To UBound(m_cfTypes)
            m_cfNames(i) = m_cfPrefix & "-" & m_cfDate & "." & m_cfTypes(i)
        Next

        Set Names = Me
    End Function
End Class

Set CheckFile = (New ManageCheckFile)("chkfile", Array("bucf", "id"), "20150618")

另一种选择可能是使用 prefixdate 作为 arglist 参数:

Class ManageCheckFile
    Private m_cfNames
    Private m_cfPrefix
    Private m_cfTypes
    Private m_cfDate

    Public Property Let Names(prefix, date, types)
        m_cfPrefix = prefix
        m_cfDate   = date
        m_cfTypes  = types

        Dim i
        ReDim m_cfNames(UBound(m_cfTypes))
        For i = 0 To UBound(m_cfTypes)
            m_cfNames(i) = m_cfPrefix & "-" & m_cfDate & "." & m_cfTypes(i)
        Next
    End Property

    Public Property Get Names(prefix, date)
        Names = m_cfNames
    End Property
End Class

Set CheckFile = New ManageCheckFile
CheckFile.Names("chkfile", "20150618") = Array("bucf", "id")

然而,这没有多大意义,除非 prefixdate 确实索引了一些东西,但这里似乎不是这种情况。根据我从您的代码中看到的内容,我可能会选择数据结构或默认方法路由。