11.6 方法 4:类

    那么,何为类?它是语言设计者在特定语言中规定的一些称呼,具有多种定义。

    霍尔设想的类

    首先来看原始形态的类是怎么定义的。1965 年霍尔在 ALGOL 的扩展方案中写道:“基于便利性的考虑,现在世界中的物(objects)通常被分为几种独立的分类,而某种分类的物如能进一步分为更细的类别(subclasses)就更方便了 16。”

    16这是从“RECORD HANDLING”第 3 页和第 15 页翻译而来的。

    从这段话能看出来,他所谓的类就是分类。它和我们日常说的 economy class(经济舱)中的 class 以及分组对抗赛中的分组属于相同的用法。现在 C++ 语言和 Java 语言中使用的 class 一词被追加了很多意思变得复杂起来,但最初都是分类的意思。现在所说的类的继承以及类是像做鲷鱼烧一样创建实例的鲷鱼烧的模具,这些说法都是后来才出来的概念。

    C++ 语言中的类

    十年之后的 1979 年,本贾尼·斯特劳斯特卢普开始了 C with Classes 的开发。这也就是之后的 C++ 语言。C++ 语言中类的概念是以 Simula 这种仿真用语言 17 中的类为参考,方便用户定义类型(type)而设计出来的。斯特劳斯特卢普是这样解释的:

    17Simula 是一种专注于仿真的程序设计语言。在这种语言中,由类创建的对象会在协调的多线程模式下,像 Erlang 语言的进程一样执行并行处理。
    类是类型。这是 C++ 语言中极为重要的一种思想。既然 C++ 语言中类的意思就是用户定义的类型,那为什么不把它叫做 type 呢?我之所以选择使用 class,是因为实在不喜欢不断地创造新词,才选用 Simula 语言中 class 这个谁都不至于困惑的词。
    ——斯特劳斯特卢普《C++ 语言的设计与演化》

    能让用户定义新的、操作起来如同 int 和 float 这样内置型的类型,这是 C++ 语言中引入类的目的。C 语言中也有能将各种变量归集到一起定义新的结构体的功能。C with Classes 中的类最初就是 C 语言中的结构体。之后,斯特劳斯特卢普把他认为好用的功能陆续加入了进来。其中之一就是功能说明的作用。

    功能说明的作用

    对于 C++ 语言来讲,类( =类型 )也是功能说明的一种表现形式。也就是说,类起着一种作用,它可以声明对象具有哪些方法和不具有哪些方法。如果程序调用了不存在的方法会导致编译错误。这也是 Smalltalk 语言和 C++ 语言一个很大的区别 18。

    18请参考:斯特劳斯特卢普,“What is Object-Oriented Programming? (1991 revised version)”, 1991, p.15. http://www.stroustrup.com/whatis.pdf

    在 Smalltalk 语言中,方法的调用就是向对象传送一个消息,告诉它去执行某某名字的方法。至于对象接收到这个消息后如何响应(执行什么操作还是导致错误还是不作任何处理),这可以由接收方的对象自由决定。Smalltalk 语言的设计者同时也是面向对象一词的发明者的艾伦·凯认为,这样的自由度是面向对象的重要元素之一。

    类的三大作用

    大家是不是觉得类这个概念很复杂?的确如此。这是因为 C++ 语言和 Java 语言的类具有以下几个作用:

    ❶ 整合体的生成器

    ❷ 可行操作的功能说明

    ❸ 代码再利用的单位

    Perl 语言和 JavaScript 语言的说明主要集中在生成器的功能方面。类是制作鲷鱼烧用的模具这一说法讲的就是这个作用。

    11.6.2 节介绍的是类的功能说明的作用。Java 语言中可以定义专门实现这一功能的接口。而动态类型语言不太重视这种作用。

    第 12 章我们将探讨作用代码再利用的单位的类的作用,即继承 19。

    19当然,并不是说现在的 Perl 语言和 C++ 语言中类作为代码再利用的单元的作用消失了,只是类在不同语言中发挥的这种作用有强弱之别。另外,至少在早期 Perl 语言的包中并不具有继承功能。