集合提供了一种把一组相关的对象和一个“包含”它们的对象连接起来的方法。例如,一个发货单对象可能有一个 LineItem 对象的集合。
前面的“命名指南”中曾讨论过,集合的名称应是它所包含的对象的名称的复数。因此一个发货单对象可能有一个 LineItems 集合来包含它的 LineItem 对象。
《程序员指南》的“用对象编程”中的“Visual Basic 集合对象”中曾讨论过,Visual Basic 提供一般的集合类来管理对象组。
通过将私有的集合对象包装到类模块中,可实现部件的对象模型的集合,这样就定义了一个集合类,需要时可从中创建实例。《程序员指南》的“用对象编程”的“创建自己的集合类”中对此有解释。
除了描述需要采取的步骤,“创建自己的集合类”还包括代码示例,说明了为何集合类是使用 Collection 对象的最强健的方式。
一个强健的实现对于成功地重用部件代码是很关键的。其他的编程人员将依赖于所创建的对象的强健性。不要走捷径。
集合类应当实现下列属性和方法。
方法或属性 | 说明 |
Add | 添加一项到集合中。如果是用来创建对象,此方法应返回对新创建对象的引用。 |
Count (属性) | 返回集合中项的数目。 |
Item | 返回对集合中单个项的引用。参数可是数值索引或键值。这通常是缺省的属性。 |
Remove | 从集合中删除一项。参数可是数值索引或键值。 |
NewEnum | 返回枚举算子对象的 IUnknown 接口,For Each … Next 可用该对象来重复集合中的项。它应隐藏在类型库中。与 For Each … Next 一同工作时 Procedure ID 值必须为 -4。 |
创建一个强健的集合类的关键之一是实现自己的 Add 方法。用户的 Add 方法提供类型安全性或控制对集合的访问,可调用 Visual Basic Collection 对象的 Add 方法。
类型安全很容易实现,下列代码段是一个假想的 Widgets 集合类的 Add 方法:
Public Sub Add(ByVal NewWidget As Widget, _
Optional ByVal Key As String = "")
If String = "" Then
mcolWidgets.Add NewWidget
Else
mcolWidgets.Add NewWidget, Key
End If
End Sub
所有维护集合及产生错误信息的工作由 Visual Basic Collection 类的一个私有实例完成,对它的引用保存在 mcolWidgets
中。私有 Collection 对象的 Add 方法可以接受任何类型的对象,但它被如上所示的声明屏蔽之后,只能接受 Widget 对象。
注意 许多已存在的集合实现使用 Add 作为在集合内创建新元素的方法的名字。同样,将外部创建的对象放到集合中,我们称这种方法为 “插入”,而不叫 “添加”。
通过把集合包含的对象类设为 PublicNotCreatable,则可利用 Add 方法来控制对集合的访问。这样,Add 方法成为在集合内创建新对象的唯一方法。如果用这种方式实现 Add 方法,则它应返回对新创建对象的引用。
Add 方法是调用设置诸如 Parent 之类的只读属性的值的友元函数的好地方。
“创建自己的集合类”提供了代码示例,示范如何按照以上指南实现集合类,解释如何使 Item 成为缺省方式;如何在类型库中隐藏 NewEnum;以及如何赋予 NewEnum 正确的 Procedure ID。
Visual Basic 的专业版和企业版中包括的 Class Builder 实用程序创建的集合类源代码遵守上述的指南。用户可用自己的事件,属性及方法来定制此源代码。
详细信息 参阅参考主题中的 Add 方法、Remove 方法、Item 方法及 Count 属性,或《程序员指南》的“用对象编程”中的“Visual Basic 集合对象”。