我正在尝试从SCRRUN.DLL为Scripting.Dictionary类创建一个替换VB6类。 Scripting.Dictionary(除其他外)具有返回键数组的“Keys”方法,以及返回与键关联的项目的读/写“Item”属性。我对此感到困惑,因为它们似乎都是该类的默认值。那就是:
For Each X In MyDict
相当于:
For Each X In MyDict.Keys
对我来说意味着“Keys”是该类的默认操作,但是:
MyDict("MyKey") = "MyValue"
MsgBox MyDict("MyKey")
相当于:
MyDict.Item("MyKey") = "MyValue"
MsgBox MyDict.Item("MyKey")
对我来说意味着“Item”是该类的默认操作。
我以前从未创建过具有默认操作的VB6类,所以在实现这一点后,我想也许我可以定义多个默认操作,只要它们都有不同的签名,他们这样做:键是无效的, Item getter采用Variant,Item setter采用两个Variants。但这似乎不被允许:当我使用“工具/过程属性”将Keys函数设置为默认值,然后我用它将Item属性设置为默认值时,IDE会抱怨默认值已经确定了。
所以我觉得我在这里误解了一些基本的东西。在Scripting.Dictionary对象中发生了什么,它使得它能够像某些上下文中的默认情况一样“键”,但好像“Item”是其他情况下的默认值?无论如何,我能在VB6中完成同样的事情吗?
答案 0 :(得分:0)
好的,回答我自己的问题:我还没有尝试过,但我认为“Item”应该是默认的,我应该添加一个名为“NewEnum”的全新函数,它看起来像下面这样(稍微修改了Francesco Balena的“Programming Microsoft Visual Basic 6.0”一书中的一个例子):
Public Function NewEnum() As IUnknown
Set NewEnum = m_Keys.[_NewEnum]
End Function
(其中“m_Keys”是包含键的Collection),然后使用工具/过程属性隐藏NewEnum并将其ProcID设置为-4。
答案 1 :(得分:0)
您观察的是默认成员和集合枚举器之间的区别。 COM对象(包括VB6类)可以同时具有。
您可以通过在对象浏览器中查找微小的蓝色地球或描述中的“默认成员”(参见Contents of the Object Browser)来识别类的默认属性。对象浏览器不会识别枚举器方法,但如果您使用OLE视图或TypeLib Browser(免费但需要注册)查看类的接口定义,它的DispId将为0xfffffffc或-4。
在您自己的类中,您可以通过在“过程属性”对话框中将过程ID设置为“(默认)”来标记默认属性(请参阅Making a Property or Method the Default)。您已经在自己的答案中列出了设置集合枚举器的步骤,但您也可以在程序员指南主题Creating Your Own Collection Class: The House of Bricks中找到它。
答案 2 :(得分:-1)
Scripting.Dictionary有一个肮脏的秘密:
它根本不处理枚举,它返回大丑陋的Variant数组,你的For Each循环遍历那些。
这就是为什么Dictionary实际上效率远低于标准VB6 Collection的原因之一。