Pewarisan kelas dan penimpaan anggota

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

  1. Tipe kembalian: tipe kembalian metode yang menimpa harus sama dengan metode induk atau merupakan subtipe-nya.
  2. Tipe parameter: tipe parameter metode penimpa harus sama dengan kelas induk atau merupakan supertipe. (Contoh: intnum. num adalah supertipe dari int dan diperbolehkan.)
  3. Jumlah parameter posisi: jika metode awal memiliki n parameter posisi, metode penimpa juga harus mendeklarasikan tepat n parameter posisi.
  4. 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)
  1. Tipe statis objek penerima panggilan adalah dynamic ;
  2. Tipe statis penerima mendeklarasikan metode yang belum diimplementasikan (bisa abstrak), sedangkan tipe dinamis penerima memiliki implementasi noSuchMethod() yang berbeda dari versi bawaan milik Object.

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

Previous:
Next:

Tinggalkan Balasan

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