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.
当我写 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 一个集合。
这个对象的问题是,正如现在在 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.