You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 07:03:14