Operator is & as
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 60 dari 110.
Meskipun runtimeType memberi tahu kamu tipe yang tepat, Dart menyediakan dua operator yang lebih praktis untuk memeriksa tipe dan melakukan konversi tipe: is dan as.
Operator is memeriksa apakah sebuah object memiliki tipe tertentu dan mengembalikan nilai boolean. Tidak seperti runtimeType, operator ini juga mengembalikan true untuk tipe induk:
class Animal {}
class Dog extends Animal {}
void main() {
Animal pet = Dog();
print(pet is Dog); // true
print(pet is Animal); // true (Dog adalah Animal)
print(pet is String); // false
}Saat kamu menggunakan is di dalam pernyataan if, Dart otomatis mempromosikan tipe datanya sehingga kamu dapat mengakses anggota subclass tanpa casting eksplisit:
void handleAnimal(Animal animal) {
if (animal is Dog) {
// Di sini, Dart tahu bahwa animal adalah Dog
animal.bark(); // Bisa memanggil method khusus Dog
}
}Operator as secara eksplisit mengubah object menjadi tipe tertentu. Gunakan operator ini saat kamu yakin dengan tipenya:
Animal pet = Dog();
Dog myDog = pet as Dog; // Konversikan tipe ke Dog
myDog.bark();Berhati-hatilah saat menggunakan as. Jika konversi tipe gagal, akan muncul exception. Karena itu, menggabungkan is dengan promosi tipe sering kali lebih aman daripada langsung menggunakan as. Kamu juga bisa menggunakan is! untuk memeriksa apakah suatu object bukan bertipe tertentu.
Tantangan
MudahMari buat sistem pemrosesan bentuk yang menggunakan operator is dan as untuk mengenali dan bekerja dengan berbagai jenis bentuk. Kamu akan membuat hierarki bentuk dan menulis fungsi yang memeriksa tipe serta mengakses property khusus tipe dengan aman.
Kamu akan mengatur kodemu ke dalam dua file:
shapes.dart: Definisikan hierarki bentukmu di sini:- Class
Shapedengan propertyString namedan sebuah constructor. Sertakan methoddescribe()yang mencetak[name] is a shape - Class
Circleyang mewarisiShapedengan property tambahandouble radius. Tambahkan methodgetCircleInfo()yang mencetakCircle with radius: [radius] - Class
Rectangleyang mewarisiShapedengan property tambahandouble widthdandouble height. Tambahkan methodgetRectangleInfo()yang mencetakRectangle: [width] x [height]
- Class
main.dart: Impor file bentukmu dan buat fungsiprocessShape(Shape shape)yang:- Memanggil
describe()pada bentuk terlebih dahulu - Menggunakan
isuntuk memeriksa apakah bentuk tersebut adalahCircle, jika ya, gunakan promosi tipe untuk memanggilgetCircleInfo() - Menggunakan
isuntuk memeriksa apakah bentuk tersebut adalahRectangle, jika ya, gunakan operatorasuntuk melakukan cast dan memanggilgetRectangleInfo() - Menggunakan
is!untuk memeriksa apakah bentuk tersebut BUKANCircledan BUKANRectangle, jika ya, cetakUnknown shape type
main():- Buat
Circlebernama'Round'dengan radius5.0dan berikan keprocessShape() - Cetak baris kosong
- Buat
Rectanglebernama'Box'dengan width4.0dan height3.0dan berikan keprocessShape() - Cetak baris kosong
- Buat
Shapedasar bernama'Mystery'dan berikan keprocessShape()
- Memanggil
Tantangan ini menunjukkan kedua pendekatan: menggunakan is dengan promosi tipe otomatis untuk Circle, dan menggunakan as untuk melakukan cast secara eksplisit dengan Rectangle. Kamu juga akan melihat bagaimana is! membantu mengenali bentuk yang tidak cocok dengan subtype tertentu.
Output yang diharapkan:
Round is a shape
Circle with radius: 5.0
Box is a shape
Rectangle: 4.0 x 3.0
Mystery is a shape
Unknown shape typeCoba sendiri
import 'shapes.dart';
// TODO: Buat fungsi processShape(Shape shape) yang:
// 1. Pertama, memanggil describe() pada shape
// 2. Menggunakan 'is' untuk memeriksa apakah shape adalah Circle. Jika ya, gunakan promosi tipe untuk memanggil getCircleInfo()
// 3. Menggunakan 'is' untuk memeriksa apakah shape adalah Rectangle. Jika ya, gunakan operator 'as' untuk mengonversi tipe dan memanggil getRectangleInfo()
// 4. Menggunakan 'is!' untuk memeriksa apakah shape BUKAN Circle dan BUKAN Rectangle. Jika ya, cetak "Unknown shape type"
void main() {
// TODO: Buat Circle bernama 'Round' dengan radius 5.0 dan teruskan ke processShape()
// TODO: Cetak baris kosong
// TODO: Buat Rectangle bernama 'Box' dengan lebar 4.0 dan tinggi 3.0, lalu teruskan ke processShape()
// TODO: Cetak baris kosong
// TODO: Buat Shape dasar bernama 'Mystery' dan teruskan ke processShape()
}
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