Dart语言中sealed class(密封类)的官方定义是什么
关于Dart中sealed class定义的明确说明
你在《Type Promotion | Decoding Flutter》视频中看到的“Dart没有sealed classes,所有类都可以被扩展甚至实现”的结论,仅适用于Dart 3.0正式发布前的版本,属于版本迭代带来的信息差。
你在官方语言指南枚举章节看到的关于枚举“是sealed的”描述,不是Dart对sealed class的正式通用定义,只是对枚举类型自身限制特性的表述:所有枚举默认无法被子类化、无法被实现、无法作为mixin混入、无法显式实例化,这是枚举类型的固有规则,这里只是借用“sealed”这个词描述特性,并非通用密封类特性的完整界定。
Dart 3.0及以上版本已经正式落地sealed class作为核心语言特性,官方对sealed类的正式规则界定如下:
- 被
sealed修饰符标记的类为隐式抽象类,不允许直接实例化,可以定义工厂构造函数或普通构造函数供子类调用 - 密封类的所有直接、间接子类必须和密封类定义在同一个代码库内,外部库无法继承、实现、混入密封类
- 编译器会针对密封类做穷尽性类型检查:使用switch处理密封类类型时,只要覆盖了所有子类的分支就不需要添加default兜底,漏写分支会直接抛出编译错误,这也是密封类最核心的使用价值
- 枚举类型自带的“密封”属性,本质是密封类规则在枚举场景的默认实现:枚举的所有枚举值都是其固定的子类实例,天然满足“同库定义所有可能子类”的要求,编译器同样会对枚举做switch穷尽性检查,和手动标记
sealed的类遵循一致的核心校验逻辑,但枚举是独立的特殊类型,其自带的密封属性描述不能等同于通用sealed class的正式定义。
内容的提问来源于stack exchange,提问作者森口万太郎
相关产品推荐
相关产品推荐

