第二章·第一段岩缝:类与对象


第二章 · 第一段岩缝:类与对象

章节摘要:Scala 是纯粹的面向对象语言——一切值都是对象,一切操作都是方法调用。本章讲类、对象、样例类、继承与特质的完整机制,并顺带把包与导入收拾干净。读完你能设计出不依赖样板代码的数据模型,这正是第四章集合与第五章类型系统要操作的素材。

学习目标

  • 定义主构造器直接带参数的类,理解参数与字段的关系
  • 区分 class 与 object,用伴生对象组织工厂与常量
  • 用样例类建模不可变数据,解释它自动生成的六个方法
  • 用 trait 做正交能力组合,理解混入的线性化顺序
  • 组织包结构并使用灵活的导入语法

核心概念速览

类描述"是什么",特质描述"能做什么"——Scala 用混入把两者正交分解。

子章节导航

  • 2.1 类、对象与样例类:构造器、伴生对象、模式匹配友好的数据载体。
  • 2.2 继承、特质、包与导入:抽象成员、线性化、代码组织。

子章节之间的逻辑关系

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 实例与类型类再度升级。

检查点:出岩缝前自测

  • 能解释 case class 与普通 class 在 equals、hashCode、模式匹配上的三点差异
  • 能画出三个特质叠加时的线性化顺序并手工推演输出
  • 能说出什么场景用抽象类、什么场景用特质(提示:需要构造参数时前者,需要多继承与能力叠加时后者)

与后续章节的接缝

样例类加 match 的组合在本章只是语法,到第三章会升格为"代数数据类型驱动设计"的核心方法论;特质的线性化机制,则是第五章理解 given 实例解析顺序的底层铺垫。带着这两条线索出岩缝,后面的攀登会省一半力气。
最后一个易错点值得单独提醒:样例类不要继承样例类(Scala 3 已直接禁止),需要分类时用 sealed 层级组合,这个限制正是为了保住 equals 与模式匹配的健全性。

作者与出处
原作者:灏天文库
来源:平台策划编纂
整理人: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U