如何在VBA中实现自定义可迭代类

9

我希望给我的类添加一个功能,使得它们可以在for-each循环中使用。

我已经编写了哈希表、数组列表、队列、集合等等,希望能够遍历它们。 现在我正在寻找一种实现IUnknown类来构建自定义迭代器的方法。

我已经知道如何使用

private objPeople as Collection
Public Property Get NewEnum() As IUnknown
Attribute NewEnum.VB_UserMemId = -4
Attribute NewEnum.VB_MemberFlags = "40"
    Set NewEnum = objPeople.[_NewEnum]
End Property

但是那些例子都基于Collection类,而我不想使用它。

我想要的是尝试实现IUnknown接口,但是我没有找到任何关于如何实现它的参考资料。

我在Java、C++、C#等方面有丰富的经验,因此我认为即使在VBA中也一定有一种方法可以实现这个接口,甚至可能还需要使用API调用之类的东西。


这与编程有关。请参阅评论部分以获取其他参考链接。很抱歉,我不理解您实际要实现什么? - user2140173
是的,它们是相关的。但这些都不是我不知道的。它们都从使用的Collections类中获取IUnknown迭代器。我想再走一步,而不是在我的代码中使用Collection,我想编写自己的“Iterator”(Java语言)。因此,我想能够编写“Set NewEnum = new MyIterator:NewEnum.init(Me)”而不是使用“Set NewEnum = objPeople。[_NewEnum]”来创建一个Iterator / Enumeration,以便我可以在我的类(ArrayLists,HashMaps等)上使用foreach,而无需使用Collection。 - JayC667
2个回答

8

感谢所有的建议。我自己也看到了那些想法,但是没有一个能够达到我所希望的结果:摆脱使用集合。 - JayC667
3
针对从 Google 平台过来并想要实现 IUnknown 接口的用户提出一点小建议:在 VBA 中你不能不实现基础的 COM 接口 IUnknown。每个 VBA 类都必须实现 IUnknown。你可以通过使用 TypeOf SomeClass Is IUnknown 进行测试。 - Erik A

7
答案是可以做到,但是很丑陋(需要使用 IDL、两个 .BAS 模块和两个 .cls 模块(其中一个是您的集合类模块)。 有关完整信息,请参见此链接: 在VB中创建自己的“超级集合”
祝你好运!对于我需要做的事情来说,它似乎太复杂了,所以现在我只是遍历集合对象枚举器。

哇,非常感谢您的这篇文章!是的,即使它看起来很丑陋和不专业,但仍然是可能的。这就是为什么我选择您的答案作为解决方案的原因。 - JayC667

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接