Dictionary “多重”;“违约”;VB6类中的属性/方法?

Dictionary “多重”;“违约”;VB6类中的属性/方法?,dictionary,vb6,default,Dictionary,Vb6,Default,我正在尝试为SCRRUN.DLL中的Scripting.Dictionary类替换VB6类。Dictionary有(除其他外)一个返回键数组的“Keys”方法和一个读/写“Item”属性,该属性返回与键关联的项。我对此感到困惑,因为它们似乎都是该类的默认值。即: For Each X In MyDict 相当于: For Each X In MyDict.Keys MyDict.Item("MyKey") = "MyValue" MsgBox MyDict.Item("MyKey") 对我

我正在尝试为SCRRUN.DLL中的Scripting.Dictionary类替换VB6类。Dictionary有(除其他外)一个返回键数组的“Keys”方法和一个读/写“Item”属性,该属性返回与键关联的项。我对此感到困惑,因为它们似乎都是该类的默认值。即:

For Each X In MyDict
相当于:

For Each X In MyDict.Keys
MyDict.Item("MyKey") = "MyValue"
MsgBox MyDict.Item("MyKey")
对我来说,这意味着“键”是类的默认操作,但是:

MyDict("MyKey") = "MyValue"
MsgBox MyDict("MyKey")
相当于:

For Each X In MyDict.Keys
MyDict.Item("MyKey") = "MyValue"
MsgBox MyDict.Item("MyKey")
对我来说,这意味着“Item”是类的默认操作

我以前从未创建过一个具有默认操作的VB6类,因此意识到这一点后,我想也许我可以定义多个默认操作,只要它们都有不同的签名,就像它们一样:键是空的,项getter接受一个变量,项setter接受两个变量。但这似乎是不允许的:当我使用“工具/过程属性”将Keys函数设置为默认值,然后使用它将Item属性设置为默认值时,IDE会抱怨已经设置了默认值


所以我想我误解了一些基本的东西。Scripting.Dictionary对象中发生了什么,使得它能够在某些上下文中充当“键”是默认值,而在其他上下文中充当“项”是默认值?不管它是什么,我能在VB6中完成同样的事情吗?

好的,回答我自己的问题:我还没有尝试过这个,但我认为“Item”应该成为默认值,我应该添加一个名为“NewEnum”的全新函数,它看起来类似于下面的内容(从Francesco Balena的示例中稍微修改)《Microsoft Visual Basic 6.0编程》一书:


(其中“m_Keys”是包含密钥的集合),然后使用工具/过程属性隐藏NewEnum并将其ProcID设置为-4。

Scripting.Dictionary有一个肮脏的秘密:

它根本不处理枚举,它返回大而丑陋的变量数组,并且For-Each循环迭代这些数组


这就是为什么字典的效率远远低于标准VB6集合的原因之一。

您观察到的是默认成员和集合枚举器之间的差异。COM对象(包括VB6类)可以同时具有这两种类型

通过在对象浏览器中查找微小的蓝色球体或说明中的“默认成员”(请参阅),可以识别类的默认属性。对象浏览器不会识别枚举器方法,但如果使用OLE View或(免费但需要注册)查看类的接口定义,则对象浏览器将不会识别枚举器方法它将是0xFFFFFC或-4


在您自己的类中,可以通过在“过程属性”对话框中将过程ID设置为“(默认)”来标记默认属性(请参见)。您已经在自己的答案中列出了设置集合枚举器的步骤,但您也可以在《程序员指南》主题中找到这些步骤。

@Bob77有一个很好的观点——《提供商程序员指南》中实际上有很多很好的信息。您可以从随附的文档中访问它,或者从其他文档中访问它。您认为呢r简单的事实解决问题。这会在即时窗口中打印“未知”:实际上,对象浏览器确实会显示枚举数。您只需打开“显示隐藏成员”。@Bob77是的,但即使您正在查看隐藏成员,它也不会特别标记它已设置为枚举数。