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

Dart 3.0 新类修饰符工作机制及三类修饰符差异咨询

Dart 3.0 类修饰符工作机制及核心差异解析

Dart 3.0 引入了一系列明确的类修饰符,解决了之前类同时扮演"可实例化类"和"接口"角色的语义模糊问题,让代码契约更清晰,编译时能提供更严格的检查。下面重点解析核心修饰符的工作机制及差异。

一、interface 与 abstract 的核心区别

1. 语义定位

  • abstract:标记类为抽象类,核心是表示这个类是"不完整的",需要子类继承并补全抽象成员。它允许同时包含已实现的方法和抽象方法,兼顾代码复用和契约定义。
  • interface:标记类为纯接口类,核心是定义一套"行为契约",只关注方法/属性的签名,不提供可直接复用的实现(除非用default关键字声明默认逻辑)。

2. 继承/实现规则

  • abstract class:既可以被extends(继承,子类自动复用父类的已实现成员),也可以被implements(当作接口,子类必须重写所有成员)。
  • interface class:只能被implements,禁止被extends,子类必须实现所有未提供默认实现的成员。

3. 实例化限制

  • abstract class:自身无法直接实例化,但子类如果实现了所有抽象成员,就可以正常实例化。
  • interface class:无论是否有默认实现,自身都不能实例化,必须通过实现它的子类来创建实例。

二、abstract class、interface、abstract interface 三者差异

1. abstract class(抽象类)

  • 核心定位:兼具代码复用模板和接口契约的双重角色,适合定义一组相关类的通用逻辑和抽象行为。
  • 成员规则:可以混合已实现方法、抽象方法、成员变量,抽象成员必须显式加abstract关键字。
  • 使用方式:支持extends(继承复用)和implements(实现契约)两种方式。
  • 实例化:自身不可实例化,子类完成抽象成员实现后可实例化。

示例代码:

abstract class Animal {
  void eat(); // 显式抽象方法
  void sleep() { // 已实现通用方法
    print('Animal is sleeping');
  }
}

// 继承抽象类,复用sleep方法
class Dog extends Animal {
  @override
  void eat() {
    print('Dog eats bone');
  }
}

2. interface class(纯接口类)

  • 核心定位:纯契约定义,只规范行为签名,不提供可复用的业务逻辑(默认实现仅作为可选的基础逻辑)。
  • 成员规则:所有成员默认是抽象的,若要提供默认实现,必须用default关键字标记。
  • 使用方式:仅允许被implements,禁止继承,子类可选择重写默认实现。
  • 实例化:自身不可实例化,必须通过实现类创建实例。

示例代码:

interface class Flyable {
  void fly(); // 默认抽象方法
  default void preFlightCheck() { // 默认实现
    print('Checking wings before flight');
  }
}

class Bird implements Flyable {
  @override
  void fly() {
    print('Bird flies high');
  }
}

3. abstract interface class(抽象接口类)

  • 核心定位:是abstract和interface的结合体,明确表示这是一个带默认实现的抽象契约,既可以定义抽象行为,也可以提供通用逻辑,但仅能作为接口被实现。
  • 成员规则:可以混合抽象方法和已实现方法,不需要用default标记已实现逻辑(和abstract class一致),但禁止被继承。
  • 使用方式:仅允许被implements,子类必须实现所有抽象成员,已实现成员需显式调用super来复用。
  • 实例化:自身不可实例化,子类完成抽象成员实现后可实例化。

示例代码:

abstract interface class Vehicle {
  void move(); // 抽象方法
  void refuel() { // 已实现通用方法
    print('Refueling the vehicle');
  }
}

class Car implements Vehicle {
  @override
  void move() {
    print('Car drives on road');
  }

  // 可选:复用父类的refuel方法
  @override
  void refuel() {
    super.refuel();
    print('Car uses gasoline');
  }
}

三者核心差异对比

特性abstract classinterface classabstract interface class
允许extends继承✅ 是❌ 否❌ 否
允许implements实现✅ 是✅ 是✅ 是
成员默认抽象性❌ 需显式加abstract✅ 默认抽象(可加default)❌ 同抽象类,无需default
已实现成员复用方式继承自动复用实现时需显式调用default实现时需显式调用super
语义定位模板+接口契约纯行为契约带默认实现的抽象契约

内容的提问来源于stack exchange,提问作者Kyle Venn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 14:24:55