在 Smalltalk 中,当我们说Stream
我们指的是响应由一些方法(例如 #next、#nextPut:、#contents 等)给出的基本协议的对象。因此,在进一步详细介绍之前,我会说stream at: 2
正如您在示例中所说的那样,这不是一个非常合适的表达方式。更合适的表达方式是Stream
将会
stream position: 2.
^stream next
所以,你首先要考虑的是你是否正在寻找一个Stream
or a Collection
。这个基本决定取决于您的对象必须实现的行为。
使用的子类Stream
如果您决定要使用#next 枚举元素,即主要按顺序排列。但是,如果您想通过以下方式访问您的元素at: index
,使用以下子类对您的对象进行建模SequenceableCollection.
如果您选择流,您将必须决定是否仅访问它们进行读取操作,或者还想修改它们的内容。你对问题的描述似乎表明你只会阅读它们。因此,您必须首先实现的基本协议是
#next "retrieve the object at the following position and advance the position"
#atEnd "answer with true if there are no more objects left"
#position "answer the current position of the implicit index"
#position: "change the implicit index to a new value"
另外,如果您的流是只读的,请将您的类设为ReadStream
.
如果您想继承更高级的方法,则还必须实现一些其他附加消息。一个例子是#next:
它检索几个连续元素的子集合(其大小由参数给出。)
如果您认为将对象建模为集合会更好,那么您必须实现的基本协议由以下三个方法组成
#at: index "retrieve the element at the given index"
#size "retrieve the total number of elements"
#do: aBlock "evaluate aBlock for every element of the receiver"
(我不认为你的收藏必须支持at:put:.
)
最近,我们遇到了您所描述的同样问题,并决定将我们的对象建模为集合(而不是流)。但是,无论您最终将采用哪种方法,我认为您都应该尝试两种方法,看看哪种方法更好。没有人会比您的 Smalltalk 系统给您更好的建议。
顺便说一句,还要注意,如果您有(可排序的)Collection
,你会得到一个Stream
免费:只需发送#readStream
给你的收藏!