2011-03-09 36 views
3

我尝试了类模块内的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方法的公共函数定义的优点是什么?

+0

我很确定你不能,但我会让一个100%肯定答案的人。 – 2011-03-09 20:05:59

回答

2

你可以使用一个变体或对象类型和手动处理的类型检查?

可选参数的混合也可能是可能的,但它不完全等同于重载。

1

编号

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

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 

欲了解更多详情,请参阅丹Appleman的优秀图书Developing COM/ActiveX Components In Visual Basic 6