Extension Types

编译期包装,运行时无额外对象(零开销);用来给原有类型换一套静态接口,限制可用方法。

区别普通 Extension:普通扩展给原始类型全体实例加方法;Extension Type 只在静态类型为该扩展类型时生效。

// int 是【表示类型】,id 是底层原始对象名称
extension type IdNumber(int id) {
  operator <(IdNumber other) => id < other.id;
}Code language: Dart (dart)

自动生成:

  1. 隐式构造 IdNumber(int id)
  2. getter:int get id

两大模式(最常用)

1)非透明

隔离接口|推荐业务约束

不加 implements

隔离底层类型方法,实现接口限制

不能直接和底层类型互相赋值

extension type IdNumber(int id) {
  operator <(IdNumber other) => id < other.id;
}

void main() {
  final id = IdNumber(100);
  id + 5;          // 报错:没有 + 运算符 屏蔽int加法
  final int raw = id; // 报错 不能直接赋值
  final int raw = id as int; // 强制转型拿到底层值
}Code language: PHP (php)

2)透明模式

implements 表示类型

自动继承底层所有成员,仅新增 / 覆盖方法

extension type Num(int v) implements int {
  Num square() => Num(v * v);
}

void main() {
  final n = Num(5);
  print(n.isNegative); //  可以直接调用int原生方法
}Code language: Dart (dart)

构造函数用法

底层括号是默认构造,可以私有化隐藏 ._

extension type Id._(int _raw) {
  // 外部只能用这个构造,禁止直接 Id(xxx)
  Id.create(int value) : _raw = value;
}Code language: JavaScript (javascript)

支持:方法、getter、setter、运算符

禁止:实例变量、abstract 成员

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注