本节剩下的部分将讨论操纵对象时要考虑的另一些因素。 

1 集合与继承器 

针对一个特定问题的解决, 如果事先不知道需要多少个对象, 或者它们的持续时间有多长, 那么也不知道如何保存那些对象。 既然如此, 怎样才能知道那些对象要求多少空间呢? 事先上根本无法提前知道, 除非进入运行期。 

在面向对象的设计中, 大多数问题的解决办法似乎都有些轻率——只是简单地创建另一种类型的对象。 用于解决特定问题的新型对象容纳了指向其他对象的句柄。 当然, 也可以用数组来做同样的事情, 那是大多数语言都具有的一种功能。但不能只看到这一点。 这种新对象通常叫作“集合” (亦叫作一个“容器” , 但AWT 在不同的场合应用了这个术语, 所以本书将一直沿用“集合” 的称呼。 在需要的时候, 集合会自动扩充自己, 以便适应我们在其中置入的任何东西。 所以我们事先不必知道要在一个集合里容下多少东西。 只需创建一个集合, 以后的工作让它自己负责好了。 

幸运的是, 设计优良的 OOP 语言都配套提供了一系列集合。 在 C++中, 它们是以“标准模板库” (STL) 的形式提供的。 Object Pascal 用自己的“可视组件库” (VCL) 提供集合。 Smalltalk 提供了 一套非常完整的集合。 而 Java 也用自己的标准库提供了集合。 在某些库中, 一个常规集合便可满足人们的大多数要求; 而在另一些库中(特别是 C++的库), 则面向不同的需求提供了 不同类型的集合。 例如, 可以用一个矢量统一对所有元素的访问方式; 一个链接列表则用于保证所有元素的插入统一。 所以我们能根据自己的需要选择适当的类型。 其中包括集、 队列、 散列表、 树、 堆栈等等。 

所有集合都提供了 相应的读写功能。 将某样东西置入集合时, 采用的方式是十分明显的。 有一个叫作“推” (Push)、 “添加” (Add) 或其他类似名字的函数用于做这件事情。 但将数据从集合中取出的时候, 方式却并不总是那么明显。如果是一个数组形式的实体, 比如一个矢量(Vector), 那么也许能用索引运算符或函数。 但在许多情况下, 这样做往往会无功而返。 此外, 单选定函数的功能是非常有限的。 如果想对集合中的一系列元素进行操纵或比较, 而不是仅仅面向一个, 这时又该怎么办呢?

 办法就是使用一个“继续器” (Iterator), 它属于一种对象, 负责选择集合内的元素, 并把它们提供给继承器的用户。 作为一个类, 它也提供了一级抽象。利用这一级抽象, 可将集合细节与用于访问那个集合的代码隔离开。 通过继承器的作用, 集合被抽象成一个简单的序列。 继承器允许我们遍历那个序列, 同时毋需关心基础结构是什么——换言之, 不管它是一个矢量、 一个链接列表、 一个堆栈, 还是其他什么东西。 这样一来, 我们就可以灵活地改变基础数据, 不会对程序里的代码造成干扰。 Java 最开始(在 1。 0 和 1。 1 版中) 提供的是一个标准继承器, 名为 Enumeration(枚举), 为它的所有集合类提供服务。文献综述

新增一个更复杂的集合库, 其中包含了一个名为 Iterator 的继承器, 可以做比老式的 Enumeration 更多的事情。 从设计角度出发, 我们需要的是一个全功能的序列。 通过对它的操纵, 应该能解决自己的问题。 如果一种类型的序列即可满足我们的所有要求, 那么完全没有必要再换用不同的类型。有两方面的原因促使我们需要对集合作出选择。首先,集合提供了不同的接口类型以及外部行为。 堆栈的接口与行为与队列的不同, 而队列的接口与行为又与一个集(Set) 或列表的不同。 利用这个特征, 我们解决问题时便有更大的灵活性。

上一篇:SSH框架实现的试题库管理系统英文文献和中文翻译
下一篇:Java编程语言英文文献和中文翻译

基于对象的编程评估英文文献和中文翻译

对象的创建和生命周期英文文献和中文翻译

JDBCResultSet对象英文文献和中文翻译

java对象的介绍英文文献和中文翻译

VB程序设计英文文献和中文翻译

我国风险投资的发展现状问题及对策分析

老年2型糖尿病患者运动疗...

网络语言“XX体”研究

新課改下小學语文洧效阅...

麦秸秆还田和沼液灌溉对...

互联网教育”变革路径研究进展【7972字】

LiMn1-xFexPO4正极材料合成及充放电性能研究

安康汉江网讯

ASP.net+sqlserver企业设备管理系统设计与开发

张洁小说《无字》中的女性意识