Extension Types

Encapsulé à la compilation, sans objet supplémentaire à l’exécution (aucun surcoût). Il permet d’attribuer une nouvelle interface statique aux types existants et de limiter les méthodes accessibles.

Différence avec les Extensions classiques : les extensions standards ajoutent des méthodes à toutes les instances du type de base ; un Extension Type ne s’applique que quand le type statique correspond à ce type d’extension.

// int est le type de représentation, id désigne la valeur brute sous-jacente
extension type IdNumber(int id) {
  operator <(IdNumber other) => id < other.id;
}Langage du code : Dart (dart)

Éléments générés automatiquement :

  1. Constructeur implicite IdNumber(int id)
  2. Getter : int get id

Deux modes principaux (les plus utilisés)

1) Mode opaque

Interface isolée|Conseillé pour les contraintes métier

Ne pas écrire le mot-clé implements

Masque les méthodes du type sous-jacent pour appliquer des restrictions d’interface

Aucune affectation directe autorisée entre ce type et le type de base

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

void main() {
  final id = IdNumber(100);
  id + 5;          // Erreur compilation : pas d'opérateur +, l'addition int est masquée
  final int raw = id; // Erreur, affectation directe interdite
  final int raw = id as int; // Cast explicite pour récupérer la valeur brute
}Langage du code : PHP (php)

2) Mode transparent

implements type-de-représentation

Hérite automatiquement de tous les membres du type sous-jacent ; seul l’ajout ou la redéfinition de méthodes est permis

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

void main() {
  final n = Num(5);
  print(n.isNegative); // Les méthodes natives de int sont directement exploitables
}Langage du code : Dart (dart)

Utilisation des constructeurs

Le paramètre entre parenthèses constitue le constructeur par défaut, il peut être masqué en mode privé grâce à ._

extension type Id._(int _raw) {
  // Le code externe ne peut utiliser que ce constructeur nommé ; appel direct Id(xxx) interdit
  Id.create(int value) : _raw = value;
}Langage du code : JavaScript (javascript)

Éléments autorisés : méthodes, getters, setters, opérateurs

Éléments interdits : variables d’instance, membres abstraits

Extension Types

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *