4.5 抽象数据类型
将数据连同函数捆绑在一起的能力可以用于创建新的数据类型。这常常被称为封装(encapsulation)[1]。一个已存在的数据类型可能有几块数据封装在一起,例如float,有一个指数,一个尾数和一个符号位。我们能够告诉它做事情:与另一个float或int相加,等等。它有属性和行为。
Stash的定义创建了一个新数据类型,可以add()、fetch()和inflate()。由说明Stash s创建一个Stash就像由说明float f创建一个float一样。一个Stash也有属性和行为,甚至它的活动就像一个实数—一个内建的数据类型。称Stash为抽象数据类型(abstract data type),也许这是因为它能允许从问题空间抽象概念到解空间。另外,C++编译器把它看做一个新的数据类型,如果说一个函数需要一个Stash,编译器就确保传递了一个Stash给这个函数。对抽象数据类型[有时称为用户定义类型(user-defined type)]的类型检查就像对内建类型的类型检查一样严格。
然而,我们会看到在对象上执行操作的方法有所不同。object.member Function(arglist)是对一个对象“调用一个成员函数”。而在面向对象的用法中,也称之为“向一个对象发送消息”。这样,对于Stash s,语句s.add(&i)“发送消息给s”,也就是说,“将它与自己add()”。事实上,面向对象编程可以总结为一句话,“向对象发送消息”。实际上,需要做的所有事情就是创建一束对象并且给它们发送消息。当然,技巧是勾画出对象和消息是什么,但如果完成了这些,用C++的实现就直截了当了。
[1]这个词会引起争论,一些人采用此处的定义,还有一些人用它描述访问权限控制(在第5章讨论)。