Dart中sealed类与abstract类的区别及适用场景示例
Dart中Sealed类与Abstract类的区别、适用场景及示例
核心区别
- 抽象类(abstract):是定义通用行为的模板,仅强制子类实现指定方法/属性,但不限制子类的数量和定义位置——子类可以在任意文件、任意库中扩展。它的核心是抽离共性,而非限定类型范围。
- 密封类(sealed):严格限制继承范围,所有子类必须与密封类处于**同一个库(文件)**中。编译器能知晓该类的所有可能子类,因此支持穷尽式分支判断(无需default分支,遗漏情况会直接报错)。
各自适用场景
Abstract类适用场景
- 需要定义通用行为规范,但不关心具体有多少子类实现时,比如UI组件基类、网络请求抽象层、数据库操作接口。
- 希望开放扩展能力时,比如第三方库提供的抽象接口,允许用户在自己的代码中自定义实现。
Sealed类适用场景
- 必须限定类型的所有可能情况时,比如状态管理中的加载状态(加载中/成功/失败)、路由页面类型、表达式语法节点类型。
- 需要利用编译器的穷尽检查避免逻辑遗漏时,比如处理状态分支时,确保所有可能的状态都被覆盖,不会出现未处理的边缘情况。
示例代码
Abstract类示例
定义一个抽象的Shape类,要求所有子类实现计算面积的方法,子类可在任意位置定义:
abstract class Shape { double getArea(); } // 子类可以在同一文件或其他文件定义 class Circle extends Shape { final double radius; Circle(this.radius); @override double getArea() => 3.14 * radius * radius; } class Rectangle extends Shape { final double width; final double height; Rectangle(this.width, this.height); @override double getArea() => width * height; }
Sealed类示例
定义一个网络请求状态的密封类,所有子类必须与它同文件,使用时编译器会检查分支是否穷尽:
sealed class NetworkState {} class LoadingState extends NetworkState {} class SuccessState<T> extends NetworkState { final T data; SuccessState(this.data); } class ErrorState extends NetworkState { final String message; ErrorState(this.message); } // 处理状态时,编译器会强制覆盖所有子类分支 void handleNetworkState(NetworkState state) { switch (state) { case LoadingState(): print("加载中,请稍候..."); case SuccessState(): print("数据加载完成:${state.data}"); case ErrorState(): print("加载失败:${state.message}"); // 无需default,编译器已确认所有情况都被覆盖 } }
内容的提问来源于stack exchange,提问作者Atul maurya
相关产品推荐
相关产品推荐

