类可以扩展Collection对象吗?

时间:2011-04-21 18:12:23

标签: vba collections interface-implementation

我正在尝试在新类中扩展VBA Collection对象的功能,并使此类成为Collection的继承者,但Implements Collection语句给出了以下错误:

  

Implements:方法的错误接口   在其名称中有下划线。

什么是下划线?! AddItemRemoveCountCollection文档中列出的唯一方法。这四个都是无下划线的。

编辑:为了澄清,我正在创建一个名为UniformCollection的课程(只接受属于this approach灵感的所有相同类型的成员)。我希望实施 Collection,以便UniformCollection Collection并且可以用来代替调用其他对象的方法等时Collection

我知道我必须为Add,Item等编写委托方法/属性,并为For Each创建一个NewEnum属性,我已经这样做了。

我的问题是Implements Collection语句给出了上述错误。

奖金问题CountCollection的方法或属性吗?帮助将其称为属性,但VBA编辑器中的对象浏览器将其称为函数即方法(飞黄框)。

4 个答案:

答案 0 :(得分:6)

VBA对可以实现的类有很多限制。 NewEnum正在绊倒Collection,但即使不是,也很可能在该课程中还有其他东西可以将它绊倒。我认为它报告了它发现的第一个问题。

因为Collection的属性和方法很少,所以我只是重写它们。

Private mcolParts As Collection

Public Sub Add(clsPart As CPart)
    mcolParts.Add clsPart, CStr(clsPart.PartID)
End Sub

Public Property Get Count() As Long
    Count = mcolParts.Count
End Property

Public Property Get Item(vItm As Variant) As CPart
    Set Item = mcolParts.Item(vItm)
End Property

Public Sub Remove(vIndex As Variant)
    mcolParts.Remove vIndex
End Sub

在不知道为什么OB显示方法(它们看起来像绿盒子)。对于我的钱,方法要么改变多个属性,要么与类之外的东西进行交互。其他一切都是财产。我会调用Count和Index属性。

答案 1 :(得分:6)

您遇到了VBA中Implements的一个限制。如果另一个类具有名称中带有下划线的任何公共方法或属性,则无法实现另一个类。 Collection课程当然有_NewEnum,但任何下划线都会导致问题。

例如,如果您创建了具有以下内容的类AddressClass

Public Address_City As String

然后创建了另一个类CustomerAddress

Implements AddressClass

Private Property Get ClassInterface_Address_City() As String
End Property

Private Property Let ClassInterface_Address_City(ByVal RHS As String)
End Property

编译时,您将收到错误“对象模块需要为接口'AddressClass'实现'Address_City'。”将属性更改为AddressCity会使错误消失。

可能的解决方案:如果我理解正确,您希望实现集合类,以便将新类传递给将集合作为参数的方法。是否有可能改变这些方法?我的建议是创建自己的集合类MyCollection,然后再实现它。即UniformMyCollection这样你可以完全避免下划线问题。

至于Count,我会随时相信帮助文本中的对象浏览器。另一方面,如果您要创建自己的集合类,则选择哪一个并不重要。

答案 2 :(得分:4)

Dick Kusleika拥有大部分内容,但如果您想在自定义课程中使用For Each,则还需要:

'--- required additional property that allow to enumerate the collection with For Each
Public Property Get NewEnum() As IUnknown
    Set NewEnum = m_ColParts.[_NewEnum]
End Property

我在收藏夹(this onethis one)中找到的任何一个链接都没有讨论这个问题,但它们都值得一读。如果我找到谈论NewEnum的网站,我会做一个编辑来添加它。

修改

这两个链接都不是我想要的,但两者都讨论了NewEnum属性(包括需要添加的一些额外的巫术):

Herehere

这两个都谈论Excel,但VBA在其他Office应用程序中是相同的(包括需要export-> text edit->导入过程来获取“属性”)。

答案 3 :(得分:3)

Re RolandTumble关于“NewEnum”的说明:

我在Access 2003中的经验是“For Each”通过导入包含行

的代码正常工作
Attribute NewEnum.VB_UserMemId = -4

...但是在我“/反编译”文件(命令行开关)之后,该行已被删除(在导出时验证)并且“For Each”不起作用。

不幸的是,当“压缩和修复”不能解决问题时,我需要使用“/ Decompile”。