Extension Types

Zur Kompilierzeit verpackt, zur Laufzeit entstehen keine zusätzlichen Objekte (Null-Overhead). Damit lassen sich vorhandenen Typen neue statische Schnittstellen zuweisen und die aufrufbaren Methoden einschränken.

Unterschied zu regulären Extensions: Normale Erweiterungen fügen allen Instanzen des Basistyps Methoden hinzu. Ein Extension Type wirkt sich nur aus, wenn der statische Typ diesem Erweiterungstyp entspricht.

// int ist der Darstellungstyp, id bezeichnet den zugrundeliegenden Rohwert
extension type IdNumber(int id) {
  operator <(IdNumber other) => id < other.id;
}Code-Sprache: Dart (dart)

Automatisch erzeugte Bestandteile:

  1. Impliziter Konstruktor IdNumber(int id)
  2. Getter: int get id

Zwei gängige Betriebsmodi

1) Undurchsichtiger Modus

Geschützte Schnittstelle|Empfohlen für fachliche Einschränkungen

Das Schlüsselwort implements weglassen

Verbirgt Methoden des Basistyps, um Schnittstellenbegrenzungen durchzusetzen

Direkte Zuweisungen zwischen Erweiterungstyp und Basistyp sind nicht erlaubt

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

void main() {
  final id = IdNumber(100);
  id + 5;          // Kompilierfehler: Kein +-Operator, Addition von int wird ausgeblendet
  final int raw = id; // Fehler, direkte Zuweisung unzulässig
  final int raw = id as int; // Expliziter Cast zum Auslesen des Rohwerts
}Code-Sprache: PHP (php)

2) Durchsichtiger Modus

implements Darstellungstyp

Erbt automatisch alle Mitglieder des Basistyps; nur Hinzufügen oder Überschreiben von Methoden ist möglich

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

void main() {
  final n = Num(5);
  print(n.isNegative); // Native Methoden von int lassen sich direkt aufrufen
}Code-Sprache: Dart (dart)

Einsatz von Konstruktoren

Der Parameter in Klammern ist der Standardkonstruktor, dieser lässt sich mit ._ privat verstecken

extension type Id._(int _raw) {
  // Externer Code darf nur diesen benannten Konstruktor nutzen; direkter Aufruf Id(xxx) verboten
  Id.create(int value) : _raw = value;
}Code-Sprache: JavaScript (javascript)

Zulässig: Methoden, Getter, Setter, Operatoren

Nicht zulässig: Instanzvariablen, abstrakte Mitglieder

Extension Types

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert