Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在VBA中扩展或合并接口_Vba_Excel_Interface - Fatal编程技术网

如何在VBA中扩展或合并接口

如何在VBA中扩展或合并接口,vba,excel,interface,Vba,Excel,Interface,我正在VBA中创建一个自定义集合类,其成员必须实现两个接口。一个是库接口IComparable,它允许我对收藏进行排序,另一个是自制接口ImyObject,它保证类成员的某些属性。我通过执行以下add过程,确保只将正确的对象添加到我的集合中: Public Sub add(item As variant) If TypeOf item Is IComparable And TypeOf item Is ImyObject Then 'add to collection

我正在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
这需要
项的类具有

Implements ImyObject
Implements IComparable
我不太喜欢这个,我更喜欢一个接口
ImyComparableObject
,所以我的add过程看起来像

Public Sub add(item As ImyComparableObject)
    'item implements both by default
为什么??好吧,有几个原因

  • 我没有发现
    TypeOf item…
    在语法上非常有启发性(但可能只是因为我不熟悉接口)
  • ImyObject
    实际上只能与
    IComparable
    结合使用,因此一个将两者合并的单一接口可以确保编译器发现这一点
  • 如果需要许多接口,
    TypeOf…
    会变得笨拙,如果另一个集合类也需要相同的add定义,那么将有大量重复的代码需要维护
    • 当然,检查可以全部放在一个函数中,但是错误的可追踪性较差,如果检查也必须由其他集合类使用,那么您需要将该函数放在一个单独的公共模块中。它会变得一团糟
    • 进行检查的最佳位置是在接口定义中,因为这样编译器就可以发现问题

我试过的 我最初的想法是,
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
ImyInterface
合并成一个超级接口,只需要一个
实现
,但是:

  • 我无法手动合并代码,因为
    IComparable
    来自库
  • 即使我可以,我也不确定那些需要
    IComparable
    对象的方法是否还能识别超级接口
太长,读不下去了
那么,有没有办法合并多个接口,以便指定每个接口的函数将接受合并版本?如果没有,是否有更好的方法为例程强制执行参数的多个接口?或者我只需要手动检查类型是否正确,如果不正确,则引发运行时错误?

VB6s的帮助中讨论了这一点。记住VB6的语言是VBA(使用不同的窗体包)。见和。这里解释了COM和自动化的底层技术(Excel、VBA和自动化是为彼此设计的)。VBA没有继承性,因此“合并”接口是不可能的,并且在任何情况下都会违反接口隔离原则。多个
TypeOf
表达式都是乏味的,这就是VBA的工作原理。
IComparable_CompareTo