我在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
进行编译,即使这样,整个编译过程中也有太多的下划线(我猜)。
我真的想将IComparable
和ImyInterface
合并到一个只需要一个Implements
的超级界面中,但是:
IComparable
来自库IComparable
个对象的方法是否仍会识别超级界面那么有没有办法合并多个接口,所以指定每个接口的函数会接受合并版本?如果没有,是否有更好的方法来为例程强制执行参数的多个接口?或者我只需要手动检查类型是否正确,如果没有则引发运行时错误?