带可选参数的VBA包装方法

时间:2014-07-18 08:41:47

标签: vba wrapper

请注意确定'包装'是正确的术语。基本上,我构建了一个具有另一个类作为私有成员的类,并且我希望在父接口中公开一些(不是全部)子类的函数。为了简化示例,我将使用Collection作为示例:

'MyClass
Private m_ClsMyCollection As Collection

...

'Expose Collection.Count
Public Function Count() As Long
    Count = m_ClsMyCollection.Count
End Sub

很简单,但在使用可选参数公开方法时,我遇到了一些难点。例如,Collection.Add被声明为

Collection.Add(Item, [Key], [Before], [After])

我不确定如何包装它。简单地做是安全的:

Public Sub Add(Item, Optional Key, Optional Before, Optional After)
    m_ClsMyCollection.Add Item, Key, Before, After
End Sub

大概如果缺少可选参数,它会将Nothing传递给m_ClsMyCollection.Add中的那些参数,但我怀疑传递Nothing并不等同于根本不传递参数。

替代方案似乎是检查每个arg上的IsMissing并为每个可能的参数组合写一个传递,这看起来很疯狂:

Public Sub Add(Item, Optional Key, Optional Before, Optional After)
    If IsMissing(Key) And IsMissing(Before) And IsMissing(After) Then
        m_ClsMyCollection.Add Item:=Item
    ElseIf IsMissing(Key) And IsMissing(Before) Then
        m_ClsMyCollection.Add Item:=Item, After:=After
    ElseIf IsMissing(Key) And IsMissing(After) Then
        m_ClsMyCollection.Add Item:=Item, Before:=Before
    ...
End Sub

组合的数量随着可选参数的数量呈指数增长 - 即使只有3,我需要检查8个案例!这有必要吗?还有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

我能够通过执行以下操作来测试:

Public Sub Foo()
    Wrapper
End Sub

Public Sub Wrapper(Optional MyArg)
    Wrapped MyArg
End Sub

Public Sub Wrapped(Optional MyArg)
    Debug.Print IsMissing(MyArg)
End Sub

这会输出True,证明没有必要检查是否传递了每个可选参数 - 在上面的情况下,m_ClsMyCollection.Add Item, Key, Before, After就足够了,无论传递的是哪个参数。