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 class | interface class | abstract interface class |
|---|---|---|---|
允许extends继承 | ✅ 是 | ❌ 否 | ❌ 否 |
允许implements实现 | ✅ 是 | ✅ 是 | ✅ 是 |
| 成员默认抽象性 | ❌ 需显式加abstract | ✅ 默认抽象(可加default) | ❌ 同抽象类,无需default |
| 已实现成员复用方式 | 继承自动复用 | 实现时需显式调用default | 实现时需显式调用super |
| 语义定位 | 模板+接口契约 | 纯行为契约 | 带默认实现的抽象契约 |
内容的提问来源于stack exchange,提问作者Kyle Venn
相关产品推荐
相关产品推荐

