VBA 子类参考

VBA subclass reference

在VBA中有"subclass"用法的描述。我正在寻找它的下一步:当我添加了第一个子项目时,我想使用它,但不知道如何使用它。

当我写 baseItem(1).itemName 时,它不起作用。

我认为这只是因为 baseItem 不是集合或数组,但我不知道任何其他方式。

欢迎来到 SO!

在 vba 中,与许多其他语言一样,它是 属性。您直接调用它们而不是数字调用它们,但是您需要编写 GET/LET 方法,除非 class 是 public (这不是真正的封装直接访问)。

baseItem.itemName 由您决定。

但是...正如我之前所说,最好将访问器写入 class 作为方法。

这个人为 VBA 中的 OOP 定下了基调(对我来说): https://whosebug.com/a/45570268/8716187

他是 Rubberduck 项目的 driver。

我会问你自己是否真的需要一个 class,我会经常使用 4-10 个包含数组的键的字典。我可以将它们包裹在 class 中,但何必呢?我需要的是一个可搜索和可编辑的("array"-数组字典)。

我写的class个模块很少,好像很多时候不用它也能运行

-WWC

I assume it's just because that baseItem is not a collection or an array...

baseItem 本身既不是集合也不是数组。它只是一个 BaseClass 类型的对象。但是这个对象 baseItem 包装了一个集合,所以我们可以说它是 almost 一个集合。

这个对象的问题是,正如现在在 中定义的那样,它没有提供客户端如何访问这个集合的方法。 class BaseClass 需要修改,以便它为 inner 集合的客户端提供 access 54=]。使用 access 例如一些 public 函数意味着将从这个集合中 return 一些东西。

BaseClass 中添加这样的内容:

Public Function getSubItem(index As Variant) As SubClass
    Set getSubItem = subClassCollection.Item(index)
End Function

现在,将在运行时根据此 class 定义创建的对象将通过此函数 getSubItem 提供对 inner 集合的访问。使用此函数的代码如下所示。所以现在 almost 你想要达到的目标。

Dim name As String
name = baseItem.getSubItem(1).itemName
Debug.Print name ' Prints "Something" in output window

但它甚至可以完全按照您想要实现的目标进行制作。当导出 BaseClass.cls 的文件并将 Attribute Value.VB_UserMemId = 0 添加到函数 getSubItem 的最开头并再次将其导入项目时。

Public Function getSubItem(index As Variant) As SubClass
    Attribute Value.VB_UserMemId = 0
    Set getSubItem = subClassCollection.Item(index)
End Function

现在您可以真正按照您想要的方式编写代码了。 HTH

Dim name As String
name = baseItem(1).itemName
Debug.Print name ' Prints "Something" in output window

有关 Creating A Default Member In VBA 的更多信息,请查看例如here.