Kata Kunci Kovarian
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 61 dari 110.
Saat kamu meng-override method di subclass, Dart biasanya mengharuskan tipe parameter sama persis. Namun, terkadang kamu ingin method subclass menerima tipe yang lebih spesifik daripada parent. Kata kunci covariant memungkinkan hal ini.
Pertimbangkan skenario ketika class Animal memiliki method yang menerima Animal lain:
class Animal {
void chase(Animal other) {
print('Chasing an animal');
}
}
class Dog extends Animal {
@override
void chase(covariant Dog other) {
print('Dog chasing another dog');
}
}Tanpa covariant, Dart akan mengeluh bahwa Dog bukan tipe yang sama dengan Animal. Dengan menambahkan covariant sebelum parameter, kamu memberi tahu Dart: "Aku tahu tipe ini lebih spesifik, dan aku akan memastikan hanya tipe yang tepat yang diberikan."
Ini berguna ketika subclass secara logis hanya boleh bekerja dengan jenisnya sendiri:
void main() {
Dog dog1 = Dog();
Dog dog2 = Dog();
dog1.chase(dog2); // Berhasil: Dog mengejar anjing lain
}Namun, berhati-hatilah, menggunakan covariant memindahkan keamanan tipe ke runtime. Jika kamu memanggil method melalui referensi parent dengan tipe yang salah, kamu akan mendapatkan error saat runtime, bukan error saat compile-time. Gunakan ini jika kamu yakin dengan tipe yang diteruskan.
Tantangan
MudahMari kita buat sistem kecocokan hewan peliharaan yang menggunakan kata kunci covariant untuk memastikan hewan hanya bermain dengan sesama jenisnya. Kamu akan membuat hierarki hewan peliharaan, dengan setiap tipe memiliki method playWith yang hanya menerima hewan peliharaan dengan tipe yang sama.
Kamu akan mengatur kodemu dalam dua file:
pets.dart: Definisikan hierarki hewan peliharaanmu di sini:- Class
Petdengan propertyString namedan sebuah konstruktor. Sertakan methodplayWith(Pet other)yang mencetak[name] plays with [other.name] - Class
Catyang memperluasPetdan menimpaplayWithmenggunakan kata kuncicovariantagar hanya menerimaCat. Class ini harus mencetak[name] and [other.name] chase yarn together - Class
Dogyang memperluasPetdan menimpaplayWithmenggunakan kata kuncicovariantagar hanya menerimaDog. Class ini harus mencetak[name] and [other.name] fetch the ball together - Class
Rabbityang memperluasPetdan menimpaplayWithmenggunakan kata kuncicovariantagar hanya menerimaRabbit. Class ini harus mencetak[name] and [other.name] hop around together
- Class
main.dart: Impor file hewan peliharaanmu dan tunjukkan bagaimana setiap tipe hewan peliharaan bermain hanya dengan sesama jenisnya:- Buat dua object
Catbernama'Whiskers'dan'Mittens', lalu buat Whiskers bermain dengan Mittens - Buat dua object
Dogbernama'Buddy'dan'Max', lalu buat Buddy bermain dengan Max - Buat dua object
Rabbitbernama'Flopsy'dan'Cotton', lalu buat Flopsy bermain dengan Cotton
- Buat dua object
Kata kunci covariant memungkinkan setiap subclass mempersempit tipe parameter dari Pet menjadi tipe spesifiknya, sehingga memastikan interaksi yang aman dari segi tipe antara hewan peliharaan yang sejenis.
Output yang diharapkan:
Whiskers and Mittens chase yarn together
Buddy and Max fetch the ball together
Flopsy and Cotton hop around togetherCoba sendiri
import 'pets.dart';
void main() {
// TODO: Buat dua object Cat bernama 'Whiskers' dan 'Mittens'
// Lalu, buat Whiskers bermain dengan Mittens
// TODO: Buat dua object Dog bernama 'Buddy' dan 'Max'
// Lalu, buat Buddy bermain dengan Max
// TODO: Buat dua object Rabbit bernama 'Flopsy' dan 'Cotton'
// Lalu, buat Flopsy bermain dengan Cotton
}
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 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