Extension method
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 83 dari 110.
Terkadang kamu ingin menambahkan fungsionalitas ke class yang bukan milikmu, seperti tipe String atau int bawaan Dart. Kamu tidak bisa mengubah kode sumbernya, dan pewarisan tidak membantu untuk class final. Di sinilah extension methods berperan.
Ekstensi memungkinkan kamu menambahkan method baru ke tipe yang sudah ada tanpa mengubahnya atau membuat subclass:
extension StringExtras on String {
String reverse() {
return split('').reversed.join('');
}
bool get isPalindrome {
var cleaned = toLowerCase().replaceAll(' ', '');
return cleaned == cleaned.split('').reversed.join('');
}
}
void main() {
print('hello'.reverse()); // olleh
print('radar'.isPalindrome); // true
}Sintaksnya adalah extension ExtensionName on Type. Di dalamnya, kamu mendefinisikan method dan getter seperti pada class biasa. Setelah didefinisikan, method ini muncul pada semua instance tipe tersebut seolah-olah sudah tersedia secara bawaan.
Extension berfungsi pada tipe apa pun, termasuk class milikmu sendiri dan tipe generik:
extension IntExtras on int {
int squared() => this * this;
}
extension ListExtras<T> on List<T> {
T? get secondOrNull => length >= 2 ? this[1] : null;
}
void main() {
print(5.squared()); // 25
print([1, 2, 3].secondOrNull); // 2
}Perhatikan bahwa di dalam extension, this merujuk pada instance tempat method dipanggil. Extension adalah cara yang rapi untuk meningkatkan tipe yang sudah ada sambil menjaga kodemu tetap teratur dan mudah dibaca.
Tantangan
MudahMari tingkatkan tipe bawaan Dart dengan fungsionalitas yang berguna menggunakan method extension! Kamu akan membuat extension yang menambahkan method berguna ke tipe String dan List, lalu menggunakannya di file utama.
Kamu akan mengatur kodemu ke dalam dua file:
extensions.dart: Buat dua extension yang menambahkan kemampuan baru ke tipe yang sudah ada:- Extension bernama
StringUtilspadaStringdengan:- Method
countVowels()yang mengembalikan jumlah huruf vokal (a, e, i, o, u, tanpa membedakan huruf besar dan kecil) dalam string - Getter
initialsyang mengembalikan huruf pertama dari setiap kata (dipisahkan berdasarkan spasi), digabungkan dan diubah menjadi huruf besar. Contohnya,"hello world"menjadi"HW"
- Method
- Extension bernama
ListUtils<T>padaList<T>dengan:- Method
safeGet(int index)yang mengembalikan elemen pada indeks tersebut jika ada, ataunulljika indeks berada di luar batas - Getter
hasMultipleyang mengembalikantruejika list memiliki lebih dari satu elemen
- Method
- Extension bernama
main.dart: Impor extension-mu dan tunjukkan cara kerjanya:- Buat string
"Object Oriented Programming"dan cetak jumlah huruf vokalnya dengan format:Vowels: [count] - Cetak inisial dari string yang sama dengan format:
Initials: [initials] - Buat list bilangan bulat
[10, 20, 30] - Cetak hasil
safeGet(1)dengan format:Element at 1: [value] - Cetak hasil
safeGet(5)dengan format:Element at 5: [value] - Cetak apakah list memiliki beberapa elemen dengan format:
Has multiple: [true/false]
- Buat string
Ingat, di dalam extension, this merujuk pada instance tempat method dipanggil. Extension-mu akan membuat tipe ini terasa seolah-olah memiliki method tersebut secara bawaan!
Output yang diharapkan:
Vowels: 9
Initials: OOP
Element at 1: 20
Element at 5: null
Has multiple: trueCoba sendiri
import 'extensions.dart';
void main() {
// Buat string
String text = "Object Oriented Programming";
// TODO: Cetak jumlah huruf vokal menggunakan countVowels()
// Format: Vowels: [count]
// TODO: Cetak inisial menggunakan getter initials
// Format: Initials: [initials]
// Buat list bilangan bulat
List<int> numbers = [10, 20, 30];
// TODO: Cetak hasil safeGet(1)
// Format: Element at 1: [value]
// TODO: Cetak hasil safeGet(5)
// Format: Element at 5: [value]
// TODO: Cetak apakah list memiliki lebih dari satu elemen
// Format: Has multiple: [true/false]
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
file Eksternallibrary dan ImporPengantar OOPClass dan ObjectKata kunci thismethodVariabel InstanceDasar-Dasar ConstructorRingkasan: Kalkulator Sederhana4Keamanan Null
Pengantar Keamanan NullBisa Null vs Tidak Bisa NullOperator ? dan !Kata Kunci late dan Keamanan NullOperator Penanganan NullKeamanan Null dalam classRangkuman: Sistem Profil Pengguna7class Abstrak & Antarmuka
class AbstrakMethod abstrakAntarmuka di DartAntarmuka ImplisitMengimplementasikan vs MemperluasBeberapa AntarmukaRingkasan: Kalkulator Bentuk10Koleksi dan Generik
Gambaran Umum list, set, dan MapKoleksi dengan Tipe AmanKelas GenerikMetode GenerikBatasan GenerikIterable dan IteratorUlasan: Penyimpanan Generik13Konsep OOP Lanjutan
Komposisi vs PewarisanExtension methodClass yang Dapat DipanggilSealed class (Dart 3)Records (Dart 3)Pola dan Pencocokan (3.0)Enum dengan method2Konstruktor dalam Dart
Konstruktor DefaultKonstruktor BernamaInitializer ListsKonstruktor KonstanKonstruktor FactoryKonstruktor RedirectingRangkuman, Pembuat Bentuk5Enkapsulasi
Member Publik vs PrivatKonvensi Prefiks _Privasi Tingkat libraryPendalaman Getter & SetterPenyembunyian InformasiRingkasan: Catatan Siswa8Mixin
Pengantar MixinMembuat MixinMenggunakan Beberapa MixinKata Kunci on pada MixinMixin vs. PewarisanMixin vs. InterfaceRangkuman: Sistem Hewan3Property Class
Anggota Instance vs StaticField Final dan ConstVariabel LateMethod dan Field StaticGetter dan SetterRangkuman: Pengelola Rekening Bank6Pewarisan
Pewarisan DasarKata Kunci superPenimpaan methodAnotasi @overrideKata Kunci class finalKonstruktor dan PewarisanRangkuman, Hierarki Karyawan9Polimorfisme
Dasar-Dasar PolimorfismePolimorfisme melalui AntarmukaPemeriksaan Tipe saat RuntimeOperator is & asKata Kunci KovarianRangkuman: Pemroses PembayaranLatihan sendiri: Compiler Dart online