Mewarisi kelas Extend a class
Gunakan kata kunci extends untuk membuat subkelas yang diturunkan dari superkelas (kelas induk).
Kata kunci super berfungsi untuk memanggil anggota kelas induk (metode, konstruktor, dan lainnya) dari dalam subkelas.
class Television {
void turnOn() {
...
// Kode yang dijalankan di metode kelas induk
}
}
// SmartTelevision adalah subkelas, Television adalah superkelas
class SmartTelevision extends Television {
@override
void turnOn() {
super.turnOn(); // Panggil metode turnOn milik kelas induk
// Kode khusus untuk subkelas
...
}
}Code language: Dart (dart)
Contoh: televisi biasa berperan sebagai kelas induk, sedangkan televisi pintar sebagai subkelas. Televisi pintar mewarisi semua fungsi dari televisi biasa.
extends memiliki kegunaan lain: materi terkait tipe berparameter pada bab generik.
Contoh praktis
class Television {
void turnOn() {
print("Nyalakan televisi, aktifkan tampilan gambar dasar");
}
}
// SmartTelevision adalah subkelas, Television adalah superkelas
class SmartTelevision extends Television {
@override
void turnOn() {
super.turnOn(); // Panggil metode turnOn milik kelas induk
// Kode khusus untuk subkelas
print("Televisi pintar: aktifkan modul jaringan, muat layar awal sistem pintar");
}
}
void main() {
// Instansi televisi biasa
Television normalTv = Television();
print("===== Nyalakan televisi biasa =====");
normalTv.turnOn();
// Instansi televisi pintar
SmartTelevision smartTv = SmartTelevision();
print("\n===== Nyalakan televisi pintar =====");
smartTv.turnOn();
}Code language: Dart (dart)
Hasil eksekusi
D:\dartdemo\firstdart>dart run
Building package executable... (1.4s)
Built firstdart:firstdart.
===== Nyalakan televisi biasa =====
Nyalakan televisi, aktifkan tampilan gambar dasar
===== Nyalakan televisi pintar =====
Nyalakan televisi, aktifkan tampilan gambar dasar
Penimpaan anggota Overriding members
1. Elemen yang dapat ditimpa
Subkelas dapat menimpa: metode instan (termasuk operator), getter, setter.
2. Anotasi @override
Fungsi: memberitahu secara eksplisit bahwa metode ini sengaja menimpa anggota kelas induk, sehingga kompiler dapat melakukan pemeriksaan.
class Television {
set contrast(int value) {}
}
class SmartTelevision extends Television {
@override // Memberi tahu kompiler bahwa metode ini menimpa metode kelas induk
set contrast(num value) {}
}
Code language: JavaScript (javascript)
3. Aturan penimpaan yang valid
- Tipe kembalian: tipe kembalian metode yang menimpa harus sama dengan metode induk atau merupakan subtipe-nya.
- Tipe parameter: tipe parameter metode penimpa harus sama dengan kelas induk atau merupakan supertipe. (Contoh:
int→num. num adalah supertipe dari int dan diperbolehkan.) - Jumlah parameter posisi: jika metode awal memiliki n parameter posisi, metode penimpa juga harus mendeklarasikan tepat n parameter posisi.
- Batasan generik: metode generik tidak dapat menimpa metode non-generik dan sebaliknya.
4. Kata kunci covariant (kasus khusus pembatasan tipe)
Aturan standar melarang pembatasan tipe parameter (konversi turun dapat menimbulkan kesalahan tipe saat runtime) ;
Jika pengembang menjamin tidak akan ada kesalahan tipe, tandai parameter dengan covariant agar pembatasan tipe parameter diizinkan.
Ketika menimpa operator ==, Anda juga wajib menimpa getter hashCode yang diwarisi dari Object.
noSuchMethod ()
1. Fungsi
Ketika kode mencoba memanggil metode instan / variabel instan yang tidak ada, Anda dapat menimpa noSuchMethod() untuk menangkap panggilan dan membuat logika khusus.
Jika tidak ditimpa, akses ke anggota yang tidak ada akan langsung memunculkan NoSuchMethodError.
class A {
@override
void noSuchMethod(Invocation invocation) {
print('You tried to use a non-existent member: ${invocation.memberName}');
}
}
Code language: JavaScript (javascript)
- Objek
Invocation: menyimpan semua informasi panggilan (nama anggota, parameter, dan lainnya)
2. Dua syarat untuk memanggil metode yang tidak diimplementasikan (cukup salah satu)
- Tipe statis objek penerima panggilan adalah
dynamic; - Tipe statis penerima mendeklarasikan metode yang belum diimplementasikan (bisa abstrak), sedangkan tipe dinamis penerima memiliki implementasi
noSuchMethod()yang berbeda dari versi bawaan milikObject.
Contoh
class A {
@override
void noSuchMethod(Invocation invocation) {
print('You tried to use a non-existent member: ${invocation.memberName}');
// Tampilkan parameter dan tipe panggilan untuk informasi lengkap
print('Parameter panggilan:${invocation.arguments}');
print('Tipe pemanggilan:${invocation.runtimeType}');
}
}
void main() {
A obj = A();
// Panggilan metode tidak ada akan memicu noSuchMethod
obj.hello("test", 123);
// Akses properti yang tidak ada
obj.unknownValue;
}Code language: Dart (dart)
D:\dartdemo\firstdart>dart run
Building package executable...
Failed to build firstdart:firstdart:
bin/firstdart.dart:6:30: Error: The getter 'arguments' isn't defined for the type 'Invocation'.
- 'Invocation' is from 'dart:core'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'arguments'.
print('cal:${invocation.arguments}');
^^^^^^^^^
bin/firstdart.dart:14:7: Error: The method 'hello' isn't defined for the type 'A'.
- 'A' is from 'bin/firstdart.dart'.
Try correcting the name to the name of an existing method, or defining a method named 'hello'.
obj.hello("test", 123);
^^^^^
bin/firstdart.dart:16:7: Error: The getter 'unknownValue' isn't defined for the type 'A'.
- 'A' is from 'bin/firstdart.dart'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'unknownValue'.
obj.unknownValue;Code language: PHP (php)
Pewarisan kelas dan penimpaan anggota