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. Геттер: 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)

Поддерживаются: методы, геттеры, сеттеры, операторы

Запрещены: переменные экземпляра, абстрактные члены

Extension Types

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *