在 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 声明的惯例类进行的区别,惯例类将不被答应混入:

Dart 3.0 语法新特性 |  类型修饰符 Class modifiers

想要经过 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 承继。

  • 在新语法中只要 惯例类 才答应运用 extendswith 子句,混入类不答应运用;
  • 只要 混入类 才答应运用 on 子句,惯例类不答应运用。
  • mixin class 含有两者的血脉,所以即无法运用 extendswith 子句,也无法运用 on 子句。

Dart 3.0 语法新特性 |  类型修饰符 Class modifiers


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 润饰的类主动是抽象类,无法被实例化。

Dart 3.0 语法新特性 |  类型修饰符 Class modifiers

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

Dart 3.0 语法新特性 |  类型修饰符 Class modifiers

  • 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 最大的特色是子类型可枚举,所以在编码过程中如果少写一个,编译器就是显现地给出提示。这样能够有用防止漏写的可能,这种从语法层面躲避潜藏风险,对代码的健壮性是十分友好的。

Dart 3.0 语法新特性 |  类型修饰符 Class modifiers


3. final 类型润饰符

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

Dart 3.0 语法新特性 |  类型修饰符 Class modifiers

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

Dart 3.0 语法新特性 |  类型修饰符 Class modifiers

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

Dart 3.0 语法新特性 |  类型修饰符 Class modifiers

从这两点就不难理解,final 润饰的类能够在必定程度上关闭派生才能。


4. base 和 interface 类润饰符

base 和 interface 在我看来是一对,base 是着重 承继 ; interface 是着重 完成 。两者的的意图是:

约束外部文件对润饰类的派生和完成。

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

Dart 3.0 语法新特性 |  类型修饰符 Class modifiers

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

Dart 3.0 语法新特性 |  类型修饰符 Class modifiers


俗话说无规则不成方圆,润饰符就是约束的规则,而承受约束就会享有更长远的利益。比方承受红绿灯的约束,会让全体的交通更加顺利,减少拥堵,出事的可能性。而不是纠结于我多等了几十秒,不利于一时的享受。约束这是一种大局观,其意图是让全体更加有序。

类型润饰符的添加,能够让类本身多了一些特色,也能够操控类的派生才能,这对于构建大型应用来说是友好的。Kotlin 一直都有 sealed 密封类,这是让我垂涎的语法特性,现在 Dart 终于支撑了。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。