11.1 什么是面向对象

    内涵因语言而异的面向对象

    语言中的用语并不是共通的,在不同语言中,同一个用语的含义可能会有很大差别。本书已经多次强调这一点。笔者认为,其中最为甚者就是面向对象这个概念了,至少有两位面向对象语言的设计者把面向对象一词用来表示两种完全不同的意义。尤其是关系到类型和继承时,两者的含义是完全相反的。

    C++ 语言的设计者本贾尼·斯特劳斯特卢普在其著作 The Design and Evolution of C++1 中说道:“class 是一种创建用户自定义类型的功能。”另外,他还在论文 2 中指出:“Simula 的继承机制是解决问题的关键”“面向对象程序设计是使用了用户定义类型和继承的程序设计”,从而对类和继承给予了正面肯定。

    1中文版《C++ 语言的设计与演化》由科学出版社于 2012 年出版,裘宗燕译。
    21991 年举办的 1st European Software Festival(第一届欧洲软件节)上公开的论文“What is Object-Oriented Programming”(什么是面向对象程序设计)。在其网站(http://www2.research.att.com/~bs/homepage.html)的 research and popular papers 页面能查阅到。

    然而,“面向对象”这个词的发明者艾伦·凯(Alan kay,他同时也是 Smalltalk 语言的设计者)却持有不同的意见。当问到面向对象一词的含义时,他解释说:“我并不是反对类,但是我还没有见过不让我感到痛苦的包含类的系统”“我并不喜欢 Simula 里继承的做法”“通过不同状态的对象互相传送消息来通信的程序设计就是面向对象”{[Dr. Alan Kay on the Meaning of“Object-Oriented Programming”, http://www.purl.org/stefan_ram/pub/doc_kay_oop_en.]}。由此可以看出,他对类和继承持否定立场(图 11.1)。

    空标题文档 - 图1

    图 11.1 关于面向对象的相左意见

    本书不打算纠结“到底何为面向对象”这一定义。我们将探讨面向对象发明的缘由以及动机。图 11.2 展示了本章提及的各编程语言大致的问世时间,供读者参考。

    空标题文档 - 图2

    ※ 灰色的为面向对象语言

    图 11.2 面向对象语言的大致问世时间及演化关系

    对象是现实世界的模型

    我们是怎样理解世界的呢?我们将生活中遇见的事物总结为特定的“物”的概念,它们就是诸如桌子、椅子、银行贷款、公式、人、多项式、三角形、晶体管之类的东西。我们的思考、语言以及行动就是建立在指示、说明和操作这些所谓的“物”的基础之上。我们在用计算机解决问题的时候,有必要将现实世界中的“物”的模型在计算机中建立起来。

    以上就是程序设计语言 ALGOL60 的设计者霍尔在 1966 年演讲的内 容。3“物”的原文是 object(对象),“模型”的原文是 model(模型)。4 现实世界中物的模型在计算机中应该怎样建立?怎么才能轻松地建立这些模型?经过多人研究探讨,面向对象这个概念隆重登场了(图 11.3)5。

    3C.A.R. Hoare,“RECORD HANDLING”1966, 1.Basic Concepts http://archive.computerhistory.org/resources/text/Knuth_Don_X4100/PDF_index/k-9-pdf/k-9-u2293-Record-Handling-Hoare.pdf“our thought, language, and actions are based on the designation, description, and manipulation of these objects, either individually or in relationship with other objects.”
    4“RECORD HANDLING”1.Basic Concepts“we often need to construct within the computer a model of that aspect of the real or conceptual world…”
    5尽管 ALGOL60 本身并不是面向对象语言,但通过阅读其扩展方案,我们可以了解在面向对象诞生以前人们在做怎样的思考。

    这正是面向对象语言的设计者希望达到的目的!

    空标题文档 - 图3

    图 11.3 现实世界中的物和计算机处理模型

    什么是类

    准备学习面向对象的朋友可能最初碰到的概念就是类吧。那么类到底是什么呢?这个问题,倘若一般地去回答就要陷入泥沼,也是一个危险的问题。因为在不同的编程语言中它有不一样的含义。至少在 C++ 语言里,类被定义为是“用户可自定义的类型”。但是正如我们在第 8 章 学习到的,C++ 语言是静态类型语言,而 Ruby 语言和 Python 语言是动态类型语言。也就是说,在 Ruby 语言和 Python 语言中,类型一词指的内容和在 C++ 语言中是不一样的。在本章的剩余部分中,我们将会学习动态类型语言 Perl 和 JavaScript 中类的构造。

    类,真有必要吗?抱有这样的疑问的人似乎挺多的。那么,类是有必要的吗?大部分语言的程序设计中,类并不是不可或缺的,但 Java 语言是例外。Java 语言“把类定义为部件,将其组装起来即是程序设计”。因此,在用 Java 语言编写程序时类是必要的。

    其他诸如 C++、Python、Ruby 这样的语言,在编写程序时既可以使用类也可以不使用类。那是使用类好呢,还是不使用也可以呢?

    这取决于要编写的程序。如果仅是小规模的程序,没必要使用类的情况居多。也有人认为,在多人分工协作编写的大型程序中,使用类来划分责任范围比较好。图形用户界面的编写中面向对象的特性似乎非常管用。比如设计一个按钮,需要有放置按钮的座标和按钮的宽、高等值,也需要有表达按钮按下时的动作的函数。将实现按钮所必需的这些要素统一到类中,编写程序就会变得简单起来。