1.1.1 Scala是一种面向对象的语言
Java、C#和Ruby等编程语言的盛行,使面向对象编程(OOP)得到了大多数程序员的广泛接受。 面向对象编程,正如它名字中描述的那样,是一种使用对象的编程范式。 面向对象可以让你使用类和对象来结构化应用程序。 同时,它也是一种项目架构的方法,能够让你从很小的构建单元开始,一步一步创建出比较大的应用程序。 市面上有很多面向对象语言,但是只有其中很少一部分可以被称为纯面向对象语言。
什么样的语言是纯面向对象语言呢?对这个问题回答其实是仁者见仁,智者见智的,但是大多数人都同意以下几个特点:
- 封装/信息隐藏
- 继承
- 多态/动态绑定
- 所有预定义类型都是对象
- 所有的操作都表现为向对象发送消息
- 所有自定义类型都是对象
Scala使用的是一种类似于Smalltalk(由Alan Kay于1980左右创建的一种纯面向对象语言)的纯面向对象模型,支持以上所有特性。 它的每个值都是对象,每个操作都是一个消息发送。比如下面一个简单表达式:
1 + 2
在Scala中,这个表达式被Scala编译器解释为1.+(2)
。
这意味着你向一个整数对象(例子中的1
)传递了一个参数2
,调用了它的+
操作。
操作符和普通标识符在Scala中是被同等看待的。
进一步讲,在Scala世界里,一个标识符要么是一串儿以字母开头的字母和数字,要么是一串儿操作符。
除了+
之外,<=
、-
或*
等操作符都能被定义为方法。
除了遵循纯面向对象的特性之外,Scala还对面向对象编程做出了一新创新:
- 模块化的混入组合(Modular mixin composition)——Scala的这个特性(一般称为特质(trait))同时拥有Java接口(interface)和抽象类这两种事物的特点。你可以定义一个或多个特质做为基(contract),选择实现它的某些或全部方法。
- 自身类型(Self-type)——一个混入(minix)并不依赖于被混入类中的任何域(field)和方法(method),但有些时候,使用被混入类的域和方法其实是很有用的,Scala对这一特性的支持被称为自我类型。
- 类型抽象(Type abstraction)——编程语言中存在两种形式的抽象:参数化和抽象成员。Scala做到了对所有类型和值都支持这两种形式的抽象。
以上内容的细节将在第3-8章继续讨论。
定义 混入是一个类以继承的方式为子类提供某些功能,这个类本身一般不会实例化。 混入也可以看作是有实现(非抽象)方法的接口。