为什么VBA.Collection.Count是一个方法

问题描述 投票:10回答:1

VBA Collection有5名成员,所有成员都是方法:AddCountItem_NewEnumRemove

在5个成员中,Count方法看起来可能/应该是吸气剂而不是方法。

这是从VB6早期开始的OOP / MS设计的遗产吗?集合的设计者是否预期Count可能需要成为一种方法,并指定Count作为一种方法,以便未来的一些行为改变不会破坏接口/ COM?

编辑正如Jim Hewitt在评论中指出的那样,在线文档表明Count是一个属性,但是对象浏览器和MIDL建议不然。

这是VB6的Collection.Count Property的文档

返回包含集合中对象数的Long(长整数)。只读。

但是VB6对象浏览器显示了这个:enter image description here

在Excel 2016中,Count肯定看起来很孤独,喜欢它想成为一个吸气者......

enter image description here

编辑22 / Sep / 16:

我回想起Bruce McKinney的Hardcore Visual Basic 5 ......

这并没有完全解释为什么Collection.Count是一种方法,但它确实在某种程度上回答了为什么我不知道为什么Collection.Count是一种方法:

知道不可知的:

你认为你对集合的实现知道的任何东西都可能是错误的,对于这个版本来说可能是错误的。

关于实施细节:

随Visual Basic版本4提供的Collection类是一个很好的1版本。随Visual Basic版本5提供的Collection类不是一个好的2版本。用户提出了许多抱怨和建议。它们都没有实施。

关于收藏:

什么是收藏品?您知道它的用户界面,但您实际上并不知道内部数据结构是如何工作的。通常情况下,这不是一个问题。只要有效,谁在乎它是如何工作的?但是,第二个想法,内部实施必然会影响运营效率。如果某些操作的效率低于其他操作,那么避免慢速操作可能会很好。

Collection.Item

Visual Basic可以使[Collection.Item]工作[作为属性]。 (有人要求。)

vba methods collections vb6 getter
1个回答
4
投票

据我所知,它实际上是一种方法:

[
  odl,
  uuid(A4C46780-499F-101B-BB78-00AA00383CBB),
  helpcontext(0x000f7886),
  hidden,
  dual,
  oleautomation
]
interface _Collection : IDispatch {
    [id(00000000), helpcontext(0x000f7903)]
    HRESULT Item(
                    [in] VARIANT* Index, 
                    [out, retval] VARIANT* pvarRet);
    [id(0x00000001), helpcontext(0x000f7901)]
    HRESULT Add(
                    [in] VARIANT* Item, 
                    [in, optional] VARIANT* Key, 
                    [in, optional] VARIANT* Before, 
                    [in, optional] VARIANT* After);
    [id(0x00000002), helpcontext(0x000f7902)]
    HRESULT Count([out, retval] long* pi4);
    [id(0x00000003), helpcontext(0x000f7904)]
    HRESULT Remove([in] VARIANT* Index);
    [id(0xfffffffc)]
    HRESULT _NewEnum([out, retval] IUnknown** ppunk);
};

尽管如此,“为什么”逃脱了我。

© www.soinside.com 2019 - 2024. All rights reserved.