Extension Types

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:

  1. Konstruktor implisit IdNumber(int id)
  2. 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

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *