Dibungkus pada saat kompilasi, tidak menghasilkan objek tambahan saat runtime (tanpa beban tambahan); digunakan untuk memberikan sekumpulan antarmuka statis baru pada tipe yang sudah ada serta membatasi metode yang dapat digunakan.
Perbedaan dengan Extension biasa: ekstensi umum menambahkan metode ke seluruh instance tipe asal; Extension Type hanya akan berfungsi apabila tipe statis sama dengan tipe ekstensi tersebut.
// int adalah【tipe representasi】, id merupakan nama objek mentah di lapisan bawah
extension type IdNumber(int id) {
operator <(IdNumber other) => id < other.id;
}Code language: Dart (dart)
Dihasilkan secara otomatis:
- Konstruktor implisit
IdNumber(int id) - Getter:
int get id
Dua Mode Utama (Paling Sering Digunakan)
1) Mode Buram
Pemisahan antarmuka|Disarankan untuk pembatasan aturan bisnis
Tidak menuliskan kata kunci implements
Menyembunyikan metode tipe dasar untuk menerapkan pembatasan antarmuka
Tidak dapat melakukan penugasan langsung dengan tipe dasar
extension type IdNumber(int id) {
operator <(IdNumber other) => id < other.id;
}
void main() {
final id = IdNumber(100);
id + 5; // Galat kompilasi: tidak ada operator +, operasi penjumlahan int disembunyikan
final int raw = id; // Galat, penugasan langsung tidak diizinkan
final int raw = id as int; // Gunakan casting eksplisit untuk mendapatkan nilai dasar
}Code language: PHP (php)
2) Mode Transparan
implements tipe-representasi
Mewarisi semua anggota tipe dasar secara otomatis, hanya bisa menambahkan atau menimpa metode
extension type Num(int v) implements int {
Num square() => Num(v * v);
}
void main() {
final n = Num(5);
print(n.isNegative); // Dapat memanggil metode bawaan int secara langsung
}Code language: Dart (dart)
Cara Penggunaan Konstruktor
Parameter di dalam kurung merupakan konstruktor bawaan, dapat dibuat privat dan disembunyikan dengan ._
extension type Id._(int _raw) {
// Kode luar hanya boleh menggunakan konstruktor bernama ini, pemanggilan langsung Id(xxx) dilarang
Id.create(int value) : _raw = value;
}Code language: JavaScript (javascript)
Yang didukung: metode, getter, setter, operator
Yang dilarang: variabel instance, anggota abstrak
Extension Types