如何在VBA

时间:2018-01-07 01:00:45

标签: vba excel-vba interface excel

我在VBA中创建自定义集合类,其成员必须实现两个接口。一个是库接口IComparable,它允许我对我的集合进行排序,另一个是自制的接口ImyObject,它保证了类成员的某些属性。我确保通过以下add过程仅将正确的对象添加到我的集合中:

Public Sub add(item As variant)
    If TypeOf item Is IComparable And TypeOf item Is ImyObject Then
        'add to collection
    Else
        'raise error

这需要item的班级

Implements ImyObject
Implements IComparable

我不喜欢这么多,并且希望有一个单独的接口ImyComparableObject,所以我的添加过程看起来像

Public Sub add(item As ImyComparableObject)
    'item implements both by default

为什么呢?好几个原因

  • 我没有找到TypeOf item Is ...语法上非常有启发性的(但也许只是因为我是接口的新手)
  • ImyObject应该只与IComparable一起使用,因此合并两者的单一界面将确保编译器发现此
  • 如果需要很多接口,TypeOf ...变得笨拙,如果另一个集合类也想要相同的添加定义,那么将会有很多重复的代码需要维护
    • 当然,检查都可以代替函数,但是错误的可追踪性较低,如果检查也必须由其他集合类使用,那么您需要在一个完整的单独公共模块中使用该函数。它会变得混乱。
    • 进行检查的最佳位置是接口定义,因为编译器可以发现问题

我尝试了什么

我最初的想法是ImyInterface可以指定我的集合所持有的对象的特定方法,指定它们必须实现IComparable

由于ImyInterface应始终与IComparable一起使用,因此将IComparable要求放在ImyInterface定义中是有意义的。这给出了ImyInterface,如下所示:

Implements mscorlib.IComparable
'This does sort of work;
'Anything implementing `ImyInterface` raises a compiler error
'if `Implements IComparable` is not also present

Public Function IComparable_CompareTo(ByVal obj As Variant) As Long
    'don't really want this, but it was the only way to get the interface to compile
End Function

Public Property Get sortingValue() As Double
End Property

但实现ImyInterface的结果示例对象类只是一团糟,因为还有

ImyInterface_IComparable_CompareTo

它需要另一个(冗余的)

IComparable_CompareTo

进行编译,即使这样,整个编译过程中也有太多的下划线(我猜)。

我真的想将IComparableImyInterface合并到一个只需要一个Implements的超级界面中,但是:

  • 我无法手动合并代码,因为IComparable来自库
  • 即使我可以,我也不确定需要IComparable个对象的方法是否仍会识别超级界面

TLDR;

那么有没有办法合并多个接口,所以指定每个接口的函数会接受合并版本?如果没有,是否有更好的方法来为例程强制执行参数的多个接口?或者我只需要手动检查类型是否正确,如果没有则引发运行时错误?

0 个答案:

没有答案