课程简介
逐字稿来源状态:Official FAQ confirms that 6.102 has no lectures and active-learning classtimes are not recorded.
reading-08 · 接口、子类型和动态分派
已获用户批准接入 · 来源范围见本文说明。
来源:MIT 6.102 Spring 2026 · Reading 8: Defining ADTs with Interfaces, Generics, Enums, and Functions。依据官方阅读正文整理,非课堂逐字稿;下方示例与练习为本地自写教学示例。
核心概念与推理
接口将 ADT 的操作签名与实现类分离。TypeScript 使用结构子类型:具有要求的成员即可兼容,不一定显式 implements。但编译器只检查可表达的类型条件,无法验证完整语义契约。子类型方法应满足至少同样强的规格。静态类型决定客户可见操作,动态类型决定实际调用哪个实现。工厂函数可以隐藏构造类,泛型减少重复,而枚举适合有限的具名状态。
具体示例
interface Text { length(): number; }
function describe(x: Text): string {
return `length=${x.length()}`;
}具有 length() 方法的不同类都能被 describe 接纳。若某实现对空文本抛异常而接口承诺总是返回长度,它仍可能通过类型检查,却违反行为子类型约定。
关键机制补充
泛型把类型参数传入集合接口,让同一套操作适用于不同元素;它提供元素类型检查,仍无法决定元素的业务相等关系。工厂返回接口而不是实现类,可以把 Array 实现换成 Map 实现。公开 getter 也可暴露观察值而非字段位置,所以接口中的属性不一定要求特定 rep。
常见误区
把结构兼容当成语义兼容;用继承只为复用实现而忽略契约;工厂返回具体类导致客户依赖实现细节。
练习与检查点
写两个 Text 实现,一个数组表示、一个字符串表示,检查客户是否需要改变,并列出类型检查无法发现的违约。
检查答案时必须写清前提、推导和一个反例;仅给出术语名称不足以说明理解。可回到官方文中的 reading exercises 检验,再记录与自己最初判断的差异。
原文阅读范围
Interfaces, Subtypes, Example: MyString, Why interfaces?, Subclassing, Generic types, Enumerations, Getters and setters, ADTs in non-OOP languages, ADTs in TypeScript, Summary。
资料与边界
完整官方阅读通过上方链接查看;作业、项目及考试见 软件工程学习入口。官方 录像说明 明确:本课不设概念讲授式 lectures,课堂用于主动练习且不录像。概念材料以交互阅读提供,因此本单元不适用课堂逐字稿,也没有生成时间轴。
同一个接口,为什么实现仍可能不能替换
已获用户批准接入 · 来源范围见本文说明。
来源:MIT 6.102 Spring 2026 · Reading 8: Defining ADTs with Interfaces, Generics, Enums, and Functions。依据官方阅读正文整理,非课堂逐字稿;下方示例与练习为本地自写教学示例。
从一个具体问题开始
程序把普通集合替换为只接受正整数的集合,两者 add(number) 签名一致。类型检查器没有报错,但输入负数的老客户开始失败。接口是自动检查的起点,行为契约还需要人来维护。
看清问题背后的结构
接口将 ADT 的操作签名与实现类分离。TypeScript 使用结构子类型:具有要求的成员即可兼容,不一定显式 implements。但编译器只检查可表达的类型条件,无法验证完整语义契约。子类型方法应满足至少同样强的规格。静态类型决定客户可见操作,动态类型决定实际调用哪个实现。工厂函数可以隐藏构造类,泛型减少重复,而枚举适合有限的具名状态。
用一个小例子检验理解
interface Text { length(): number; }
function describe(x: Text): string {
return `length=${x.length()}`;
}具有 length() 方法的不同类都能被 describe 接纳。若某实现对空文本抛异常而接口承诺总是返回长度,它仍可能通过类型检查,却违反行为子类型约定。
关键机制补充
泛型把类型参数传入集合接口,让同一套操作适用于不同元素;它提供元素类型检查,仍无法决定元素的业务相等关系。工厂返回接口而不是实现类,可以把 Array 实现换成 Map 实现。公开 getter 也可暴露观察值而非字段位置,所以接口中的属性不一定要求特定 rep。
把概念放回工程决策
在接口上放统一规格,在实现上解释内部决定。客户持有接口类型,构建交给工厂;再用同一组契约测试检验所有实现。
容易走偏的地方是:把结构兼容当成语义兼容;用继承只为复用实现而忽略契约;工厂返回具体类导致客户依赖实现细节。这些问题不能通过记住一个术语自动解决,需要用具体调用者、输入和状态来检查。
亲手做一次
写两个 Text 实现,一个数组表示、一个字符串表示,检查客户是否需要改变,并列出类型检查无法发现的违约。
先独立写下判断,再对照官方阅读;这篇文章是阅读解释和练习入口,未包含原课堂的互动、时间轴或未公开内容。
中文逐字稿
Official FAQ confirms that 6.102 has no lectures and active-learning classtimes are not recorded.
英文逐字稿
Official FAQ confirms that 6.102 has no lectures and active-learning classtimes are not recorded.