【问题标题】:Overloading Properties重载属性
【发布时间】:2011-07-12 04:58:06
【问题描述】:

我尝试在类模块中的 VBA 中重载:

Dim a As Integer

Public Property Let SomeNumber(newNumber as Integer)
   a = newNumber
End Property
Public Property Let SomeNumber(newNumber as String)
   a = Val(newNumber)
End Property
Public Property Get SomeNumber() As Integer
   SomeNumber = a
End Property

编译器抱怨“检测到不明确的名称”,显然存在不同的签名。是否可以重载在 VBA 或 VB6 中的类中定义的属性?如果是这样,语法是什么?

此外,如果属性重载是不可能的,除了访问实例化对象的字段的更无缝方式之外,与公共函数定义的 get/set 方法相比,属性有什么好处?

【问题讨论】:

  • 我很确定你不能,但我会让 100% 确定的人回答。

标签: vba syntax properties vb6 overloading


【解决方案1】:

您可以使用变体或对象类型并手动处理类型检查吗?

也可以混合使用可选参数,但也不完全等同于重载。

【讨论】:

    【解决方案2】:

    没有。

    解决方法是使用变体,它允许客户端传递任何内容。但是你必须编写代码在运行时进行类型检查:

    Public Property Let SomeNumber(newNumber as Variant)
       Select Case VarType(newNumber) 
          Case vbInteger         '' Caller passed an integer
            a = newNumber
          Case vbString          '' Caller passed a string
            a = Val(newNumber)
          Case Else
            Err.Raise vbObjectError+513, , "Invalid type passed"
          End Select
    End Property
    Public Property Get SomeNumber() As Variant
       SomeNumber = a
    End Property
    

    更多详情请参阅 Dan Appleman 的优秀书籍Developing COM/ActiveX Components In Visual Basic 6

    【讨论】:

      【解决方案3】:

      据我所见:

      http://vbcity.com/forums/t/76453.aspx

      在您转换为 VB.NET 之前,您似乎很不走运。

      【讨论】:

        【解决方案4】:

        有一个关于这个话题的帖子:

        Function Overloading and UDF in Excel VBA

        【讨论】:

        • 这是一个类似的线程,但不是我想要的。仍然有很好的洞察力。
        猜你喜欢
        • 2011-06-17
        • 2012-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多