章节摘要:Scala 是纯粹的面向对象语言——一切值都是对象,一切操作都是方法调用。本章讲类、对象、样例类、继承与特质的完整机制,并顺带把包与导入收拾干净。读完你能设计出不依赖样板代码的数据模型,这正是第四章集合与第五章类型系统要操作的素材。
类描述"是什么",特质描述"能做什么"——Scala 用混入把两者正交分解。
2.1 解决"数据怎么装",2.2 解决"行为怎么拼、代码怎么摆"。装好数据、拼好行为,第三章就能把面向对象放下,专心用函数处理这些数据。
[类/对象/样例类] --建模--> [特质混入 + 包组织] | | +--------> 第三章:把模型交给函数去变换
前置:第一章的表达式与函数。延伸:样例类与模式匹配是天生一对(3.3 节);特质上的类型参数是 5.1 型变的演练场。
延续第一章的温度转换工具,这一章把它从一堆顶层函数重构成有骨架的小模块,过程本身就是本章知识点的完整演习:
package temp trait Scale: // 特质:单位的能力约定 def name: String def toCelsius(v: Double): Double object Celsius extends Scale: def name = "C" def toCelsius(v: Double) = v object Fahrenheit extends Scale: def name = "F" def toCelsius(v: Double) = (v - 32) * 5 / 9 case class Reading(value: Double, scale: Scale): def asCelsius: Double = scale.toCelsius(value) // 样例类携带数据与单位
重构分四步走:先抽 Scale 特质把"单位"抽象出来,再为每种单位建单例对象,然后把读数建模成样例类,最后包进 package temp 收纳命名空间。走完这四步,你会直观看到"特质定能力、对象做实现、样例类承数据"的分工——这套分工将在第五章被 given 实例与类型类再度升级。
样例类加 match 的组合在本章只是语法,到第三章会升格为"代数数据类型驱动设计"的核心方法论;特质的线性化机制,则是第五章理解 given 实例解析顺序的底层铺垫。带着这两条线索出岩缝,后面的攀登会省一半力气。
最后一个易错点值得单独提醒:样例类不要继承样例类(Scala 3 已直接禁止),需要分类时用 sealed 层级组合,这个限制正是为了保住 equals 与模式匹配的健全性。