【问题标题】:How to implement custom iterable class in VBA如何在 VBA 中实现自定义可迭代类
【发布时间】:2013-12-10 06:54:55
【问题描述】:

我想在我的类中添加一个特性,这样我就可以在 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 调用之类的东西。

【问题讨论】:

  • this 是相关的。有关其他参考资料的链接,请参见 cmets 部分。很抱歉,我不明白您实际上要实施什么?
  • 是的,他们是真实的。但没有什么是我不知道的。他们都从他们正在使用的 Collections 类中获得 IUnknown 迭代器。我想更进一步,而不是在我的代码中使用 Collection,我想编写自己的“迭代器”(java 语言)。因此,我不想使用“Set NewEnum = objPeople.[_NewEnum]”,而是希望能够编写“Set NewEnum = new MyIterator: NewEnum.init(Me)”来创建一个迭代器/枚举,这样我就可以在我的类上使用 foreach ( ArrayLists, HashMaps ets) 无需使用 Collection。

标签: excel class vba foreach iunknown


【解决方案1】:

它的长短是you can't implement IUnknownCollection 也是如此。它们都是无法在 VBA 中扩展的 Com 对象。你可以create custom collections 做其他very cool iterable things

【讨论】:

  • 感谢所有输入。我自己也看到了这些想法,但没有一个会导致我希望的结果:摆脱使用 Collection。
  • 针对来自 Google 并希望实施 IUnknown 的人的挑剔:您不能在 VBA 中实施 IUnknown。它是基本的 COM 接口。每个 VBA 类都实现了IUnknown。您可以使用TypeOf SomeClass Is IUnknown 进行测试
【解决方案2】:

答案是可以做到,但是很丑(需要和IDL、两个.BAS 模块和两个.cls 模块(其中一个是你的Collection Class 模块)。 有关完整信息,请参阅此链接:

Create Your Own "Super Collections" in VB

祝你好运!我需要做的事情似乎很复杂,所以现在我只遍历 Collection 对象枚举器。

【讨论】:

  • 哇,非常感谢这篇文章!是的,即使它非常丑陋 - hackish,它仍然是可能的。这就是为什么我选择你的答案作为解决方案。
猜你喜欢
  • 1970-01-01
  • 2017-05-05
  • 2021-12-26
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
  • 2015-05-26
  • 2016-11-04
  • 2011-01-22
相关资源
最近更新 更多