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:
- Impliziter Konstruktor
IdNumber(int id) - 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