Override noSuchMethod
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 74 dari 110.
Saat kamu memanggil method yang tidak ada pada object, Dart biasanya memunculkan NoSuchMethodError. Namun, kamu dapat meng-override method khusus noSuchMethod() untuk mencegat pemanggilan ini dan menanganinya dengan baik.
Untuk menggunakan noSuchMethod(), class-mu juga harus mengimplementasikan interface atau menggunakan pengetikan dynamic.
method menerima object Invocation yang berisi detail tentang pemanggilan yang dicoba:
class Flexible {
@override
dynamic noSuchMethod(Invocation invocation) {
var methodName = invocation.memberName.toString();
print('Called: $methodName');
return null;
}
}
void main() {
dynamic obj = Flexible();
obj.anyMethod(); // Dipanggil: Symbol("anyMethod")
obj.anotherOne(42); // Dipanggil: Symbol("anotherOne")
}Object Invocation memberikan informasi berguna tentang pemanggilan, memberName memberikan nama method dalam bentuk Symbol, positionalArguments berisi argumen yang diberikan, dan isMethod memberitahumu apakah pemanggilan tersebut adalah pemanggilan method, bukan getter atau setter.
class Logger {
@override
dynamic noSuchMethod(Invocation invocation) {
print('Method: ${invocation.memberName}');
print('Args: ${invocation.positionalArguments}');
return 'handled';
}
}
void main() {
dynamic log = Logger();
var result = log.save('data', 123);
print(result); // handled
}Teknik ini berguna untuk membuat object proxy, class tiruan untuk pengujian, atau membangun API fleksibel yang merespons pemanggilan method sembarang. Namun, gunakan teknik ini seperlunya karena teknik ini melewati pemeriksaan tipe saat kompilasi.
Tantangan
MudahMari buat pencatat method yang mencegat dan mencatat setiap pemanggilan method pada sebuah object! Kamu akan membuat class yang menggunakan noSuchMethod() untuk menangkap informasi tentang pemanggilan method yang tidak didefinisikan dan merespons dengan tepat berdasarkan nama method.
Kamu akan mengatur kodemu ke dalam dua file:
method_logger.dart: Buat classMethodLoggeryang mencegat pemanggilan method yang tidak didefinisikan. Logger-mu harus meng-overridenoSuchMethod()untuk:- Mengambil nama method dari pemanggilan (namanya berupa Symbol seperti
Symbol("methodName"), kamu perlu mengubahnya menjadi string dan mengambil namanya saja) - Mencetak nama method dan argumen posisi apa pun dalam format ini:
Called: [methodName] with args: [arguments] - Mengembalikan respons khusus berdasarkan nama method:
- Jika nama method berisi
get, kembalikan string'data retrieved' - Jika nama method berisi
save, kembalikan string'data saved' - Jika tidak, kembalikan string
'unknown action'
- Jika nama method berisi
- Mengambil nama method dari pemanggilan (namanya berupa Symbol seperti
main.dart: Impor logger-mu dan tunjukkan cara logger menangani berbagai pemanggilan method yang tidak didefinisikan. Ingat, gunakan tipedynamicagar Dart mengizinkan pemanggilan method yang tidak ada:- Buat instance
MethodLoggermenggunakan variabel dynamic - Panggil
getUserData('Alice', 42)pada instance itu dan cetak hasil yang dikembalikan - Panggil
saveRecord('important')pada instance itu dan cetak hasil yang dikembalikan - Panggil
processItem()pada instance itu tanpa argumen, lalu cetak hasil yang dikembalikan
- Buat instance
Untuk mengambil nama method dari Symbol, kamu bisa mengubahnya menjadi string, lalu mengambil nama di antara tanda kutip. Misalnya, Symbol("myMethod").toString() menghasilkan 'Symbol("myMethod")'.
Output yang diharapkan:
Called: getUserData with args: [Alice, 42]
data retrieved
Called: saveRecord with args: [important]
data saved
Called: processItem with args: []
unknown actionCoba sendiri
import 'method_logger.dart';
void main() {
// TODO: Buat instance MethodLogger menggunakan tipe dynamic
// Penggunaan dynamic memungkinkanmu memanggil method yang belum ada saat compile
dynamic logger;
// TODO: Panggil getUserData('Alice', 42) dan cetak hasilnya
// TODO: Panggil saveRecord('important') dan cetak hasilnya
// TODO: Panggil processItem() tanpa argumen dan cetak hasilnya
}
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 Generik2Konstruktor 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 Hewan11Metode Khusus
Override toString()Override hashCode & ==Antarmuka Comparablecall() methodOverride noSuchMethodRingkasan: Koleksi Kustom3Property 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