请注意确定'包装'是正确的术语。基本上,我构建了一个具有另一个类作为私有成员的类,并且我希望在父接口中公开一些(不是全部)子类的函数。为了简化示例,我将使用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个案例!这有必要吗?还有更好的方法吗?
答案 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
就足够了,无论传递的是哪个参数。