在 dart 3.0.0 之后,对类型的润饰符进行了拓展,现在类型的润饰符有:
称号 | 作用 |
---|---|
mixin | 混入类润饰符 |
sealed | 密封可枚举的子类型 |
abstract | 抽象类润饰符 |
final | 必定程度上关闭派生才能 |
base | 基 |
interface | 接口 |
1. mixin 语法改变
在 dart 3.0.0 之前, 没有结构方法的 class 能够视为 mixin , 下面的代码是答应的:
class A {}
class C with A {}
在 dart 3.0.0 之后, mixin 变严格了,和 class 声明的惯例类进行的区别,惯例类将不被答应混入:

想要经过 with 关键字混入 A,需求经过 mixin 声明类:
mixin A {}
class C with A {}
或者经过 mixin 关键字对 class 进行润饰:
mixin class A {}
class C with A {}
也就是说,现在 Dart 中将 混入类 和 惯例类 进行了语法等级的区别:
mixin 声明定义了一个混入类,答应被经过 with 混入或 on 承继。
class 声明定义了一个惯例类,答应被经过 extends 承继。
mixin class 声明定义了一个既可用作惯例类又可用作混入类的类。即答应被经过 with 混入或 on 承继,又答应被经过 extends 承继。
- 在新语法中只要
惯例类
才答应运用extends
或with
子句,混入类不答应运用; - 只要
混入类
才答应运用on
子句,惯例类不答应运用。 - 而
mixin class
含有两者的血脉,所以即无法运用extends
或with
子句,也无法运用on
子句。

2. 密封类的支撑 sealed
有些类型的子类型集是已知的,可枚举的;比方登陆界面的认证状况 AuthState
,有如下三种子状况
- 认证中 AuthLoading
- 认证成功 AuthSuccess
- 认证失利 AuthFailure
这时就能够经过密封类来处理,下面的代码看起来似乎和平台的承继也没什么区别,但密封类有它的特色。
sealed class AuthState{} //创立密封类
class AuthLoading extends AuthState{}
class AuthSuccess extends AuthState{
final String user;
final String token;
AuthSuccess(this.user, this.token);
}
class AuthFailure extends AuthState{
final String error;
AuthFailure(this.error);
}
- sealed 润饰的类主动是抽象类,无法被实例化。

- sealed 润饰的类无法在外部被 承继 extended, 完成 implemented, 或 混入 with。

- sealed 润饰的类能够被 switch 挑选。
如下所示,依据AuthState
的不同状况,回来不同的字符串。在实际开发中能够回来不同的组件,在对应的分支中能够拜访对应派生类中的字段。比方 AuthSuccess 分支中能够经过state.user
拜访用户名;AuthFailure 分支中能够经过state.error
拜访错误信息:
String buildByAuthState(AuthState state){
return switch(state){
AuthLoading()=> 'AuthLoading View',
AuthSuccess()=> 'AuthSuccess View:${state.user}',
AuthFailure()=> 'AuthFailure View:${state.error}',
};
}
sealed 最大的特色是子类型可枚举,所以在编码过程中如果少写一个,编译器就是显现地给出提示。这样能够有用防止漏写的可能,这种从语法层面躲避潜藏风险,对代码的健壮性是十分友好的。

3. final 类型润饰符
final 对类进行润饰,其意图是为了关闭该类的承继系统。如下所示,被 final 润饰的类无法被直接承继;

从提示中能够看出需求承继自 final 润饰的类,子类需求被 base 、final 或 sealed 润饰:

别的 final 润饰的类无法在外部进行派生:

从这两点就不难理解,final 润饰的类能够在必定程度上关闭派生才能。
4. base 和 interface 类润饰符
base 和 interface 在我看来是一对,base 是着重 承继
; interface 是着重 完成
。两者的的意图是:
约束外部文件对润饰类的派生和完成。
base 润饰的类在外部 答应承继,不答应完成

interface 润饰的类在外部 不答应承继,答应完成

俗话说无规则不成方圆,润饰符就是约束的规则,而承受约束就会享有更长远的利益。比方承受红绿灯的约束,会让全体的交通更加顺利,减少拥堵,出事的可能性。而不是纠结于我多等了几十秒,不利于一时的享受。约束这是一种大局观,其意图是让全体更加有序。
类型润饰符的添加,能够让类本身多了一些特色,也能够操控类的派生才能,这对于构建大型应用来说是友好的。Kotlin 一直都有 sealed 密封类,这是让我垂涎的语法特性,现在 Dart 终于支撑了。