第 7 课导言

介绍面向对象编程的基本思想,包括对象、实例、类等核心概念,并说明本课使用的 Scheme 方言 STk 的安装与注意事项。

重要

重要:欢迎来到 Scheme 的世界

从这一课开始,我们将使用 Scheme 语言。 如果你读到了这条消息,说明本节内容仍在向 Racket 过渡中。接下来的这一课以及之后的所有课程都来自我们的旧版课程体系,用 Scheme 写成。

请参阅这份指南,了解如何在你的笔记本上配置 STk。

对我们的课程而言,Scheme 的语义与 Racket 几乎一致,除了以下几处主要差异:

  • 要运行 STk 解释器,在终端输入 stkw 或 stk-simply。如果你使用 Windows 电脑,只有 stk-simply 可用。
  • 加载文件不用 require,而要用 load。例如,在解释器中输入 (load "hw7.scm") 即可把该文件加载进 STk。
  • 允许重复定义。在你的 .scm 文件中,Scheme 允许你重复定义同一函数,也允许你定义同名函数来覆盖内置函数,例如 (define (map f lst) 5) 会覆盖高阶函数(Higher-Order Function,HOF)map。

当然,STk 与 Racket 的差异不止这些,但以上几点是你必须知道的。

感谢你的耐心等待!

面向对象编程(OOP)

使用泛型算子的一大优势在于:新模块可以在不改动既有代码的前提下,围绕已有模块进行设计和扩展。面向对象编程(Object Oriented Programming,OOP)是另一项具备同样优势的技术。这是我们继函数式编程之后学习的第二个主要编程范式。

面向对象编程的核心理念是:让数据自己知道如何对自身执行计算。例如,一个数字可以表示为一个对象,它知道如何与另一个数字相加、相减、相乘或相除。这样一来,程序员就可以各自独立地构建模块。要创建一种新的数据表示,程序员需要定义一个类(class),它相当于对象的蓝图,规定了该类的每个对象应当存储哪些数据、可以对这类对象执行哪些计算。使面向对象编程成为可能的三大核心思想是:消息传递(message passing)、局部状态(local state)和继承(inheritance)。

要在 Sublime 中使用 OOP 语言,你必须先在 Stk 解释器中输入以下内容:

(load "~cs61as/lib/obj.scm")

之后,你就可以按需调用 define-class 和 ask 了。

前置要求

你需要先完成第 2 单元的学习,尤其是「数据导向」(Data Directed)和「消息传递」(Message Passing)小节。

阅读材料

本节课的大部分内容摘自这份讲义。

这里有一份速查表,我们建议你在做作业和测验时使用。

你也可以看看旧的课堂笔记,点击这里。

对象(Object)

在用 OOP 编程时,我们打交道的是对象,或者说「智能数据」——它们知道如何在内部完成运算,也知道如何与其他对象交互。举个例子,我们可以有一个类型为 human 的对象 Fred。它内部知道如何「吃掉」其他对象,比如 dumpling(饺子)。OOP 于是允许我们「让 Fred 吃饺子」。

术语

使用 OOP 语言的程序员有一套专门的词汇来描述 OOP 的各个组成部分。在上面的例子中,Fred 是一个实例(instance),而 human 这个大类则是一个类(class)。

Scheme 本身并不原生支持 OOP,但我们提供了一个为 Scheme 增添 OOP 能力的扩展。本节课将聚焦于 OOP「抽象线之上」(Above the Line)的部分:我们将看到如何基于给定框架设计类并创建对象。如果你好奇 OOP 在 Scheme 中究竟是如何实现的,别担心,我们后面的一课会专门讲解。

要点回顾

在本小节中,你了解了以下术语的基本含义:

  • 面向对象编程(OOP)
  • 对象(object)
  • 实例(instance)
  • 类(class)

接下来

是时候动手玩转 OOP、定义你自己的类了!