10.5 实现类的枚举支持
在第3章中,我们已经看到了如何使用for-in
循环作为经典for循环的替代方法。在那一节中,我描述了如何将for-in
循环用于数组,字符串,集合和一些其他系统数据类型。只要类定义了枚举支持,就可以将这种循环应用于该类。尽管最明显的示例是包含元素列表的类,但从技术角度来看,此功能是相当开放的。
要在Object Pascal 中支持枚举类中的元素,必须添加一个名为 GetEnumerator
的方法,该方法返回一个类(实际的枚举类),并使用 MoveNext
方法和 Current
属性定义这个枚举类——前者用于在元素之间导航,后者用于返回实际的元素。完成这个步骤以后(我将在第二个实际示例中向您展示如何完成),编译器就可以解析for-in循环,其中目标是我们类,单独元素必须是枚举器的Current
属性的相同类型。一旦这样做了(稍后我将在一个实际例子中向你展示如何做),编译器就可以解析一个for-in
循环,其中的目标是我们的类,而各个元素必须与枚举器的Current
属性的类型相同。
虽然说并不是严格必要,但把枚举器支持类作为嵌套类型来实现似乎是个好主意(这是第 7 章中涉及的一种语言特性),因为单独使用用于枚举的特定类型毫无意义。
下面这个类是 NumbersEnumerator
示例的一部分,它存储了一系列数字(一种抽象集合),并允许对它们进行迭代。这是通过定义一个枚举器实现的,枚举器被声明为嵌套类型,并由 GetEnumerator 函数返回:
type
TNumbersRange = class
public
type
TNumbersRangeEnum = class
private
NPos: Integer;
FR