【发布时间】:2018-08-10 14:06:34
【问题描述】:
In this post VBA 中有“子类”用法的描述。我正在寻找它的下一步:当我添加了第一个子项目时,我想使用它但不知道如何。
当我写 baseItem(1).itemName 时它不起作用。
我认为这只是因为那个 baseItem 不是集合或数组,但我不知道任何其他方式。
【问题讨论】:
In this post VBA 中有“子类”用法的描述。我正在寻找它的下一步:当我添加了第一个子项目时,我想使用它但不知道如何。
当我写 baseItem(1).itemName 时它不起作用。
我认为这只是因为那个 baseItem 不是集合或数组,但我不知道任何其他方式。
【问题讨论】:
欢迎来到 SO!
在 vba 中,与许多其他语言一样,它是一个属性。您直接调用它们而不是数字,但是您需要编写 GET/LET 方法,除非该类是公共的(这并不是真正的封装以简单地直接访问)。
baseItem.itemName 是你的电话。
但是...正如我之前所说,最好将访问器作为方法写入类。
这是一个为 VBA 中的 OOP 定下基调的人(对我而言): https://stackoverflow.com/a/45570268/8716187
他是 Rubberduck 项目的司机。
我会问你自己是否真的需要一个类,我会经常使用 4-10 个包含数组的键的字典。我可以把它们包在一个班级里,但为什么要麻烦呢?我需要的是一个可搜索和可编辑的(“数组”——数组字典)。
我写的类模块很少,好像不用它也能操作很多次。
-WWC
【讨论】:
我认为这只是因为那个 baseItem 不是一个集合或一个 数组...
baseItem 本身既不是集合也不是数组。它只是一个BaseClass 类型的对象。但是这个对象baseItem 包装了一个集合,所以我们也许可以说它几乎是一个集合。
这个对象的问题是,正如它现在在the answer you mentioned 中定义的那样,它没有提供客户端如何访问这个集合的方法。类BaseClass 需要修改,以便为此类的客户端提供对这个inner 集合的访问。使用 access 例如一些public 函数意味着将从这个集合中返回一些东西。
在BaseClass 中添加这样的内容:
Public Function getSubItem(index As Variant) As SubClass
Set getSubItem = subClassCollection.Item(index)
End Function
现在将在运行时基于此类定义创建的对象将通过此函数getSubItem 提供对 inner 集合的访问。将使用此函数的代码将如下所示。所以现在几乎就是你想要达到的目标。
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
现在您可以真正按照您想要的方式编写代码。高温
Dim name As String
name = baseItem(1).itemName
Debug.Print name ' Prints "Something" in output window
有关Creating A Default Member In VBA 的更多信息,请查看例如here.
【讨论】: