Batasan Generik
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 67 dari 110.
Terkadang, kamu memerlukan tipe generik dengan kemampuan tertentu. Misalnya, jika kamu ingin membandingkan item atau mengakses property tertentu, T tanpa batasan tidak menjamin fitur tersebut tersedia. Batasan generik memungkinkan kamu membatasi parameter tipe ke tipe tertentu atau subclass-nya.
Gunakan kata kunci extends untuk membatasi parameter tipe:
class NumberBox<T extends num> {
T value;
NumberBox(this.value);
T doubled() => (value * 2) as T;
}
void main() {
var intBox = NumberBox<int>(5);
var doubleBox = NumberBox<double>(3.5);
print(intBox.doubled()); // 10
print(doubleBox.doubled()); // 7.0
// var stringBox = NumberBox<String>('hi'); // Error!
}Karena T extends num, compiler mengetahui bahwa value mendukung operasi numerik seperti perkalian. Tanpa batasan ini, pemanggilan value * 2 akan gagal.
Kendala juga berlaku pada hierarki class buatanmu sendiri:
abstract class Animal {
String get name;
}
class Dog extends Animal {
String get name => 'Dog';
}
class Shelter<T extends Animal> {
List<T> animals = [];
void add(T animal) => animals.add(animal);
void printNames() {
for (var animal in animals) {
print(animal.name); // Aman: T menjamin 'name' tersedia
}
}
}Batasan generik menggabungkan fleksibilitas generik dengan jaminan bahwa kamu mengetahui operasi apa saja yang tersedia pada tipe milikmu.
Tantangan
MudahMari buat kalkulator statistik yang hanya berfungsi dengan tipe numerik! Kamu akan membuat class generik dengan batasan yang memastikan class ini hanya dapat digunakan dengan angka, sehingga kamu dapat melakukan operasi matematika dengan aman pada nilai yang disimpan.
Kamu akan mengatur kodemu dalam dua file:
stats.dart: Buat class generikStats<T extends num>yang mengelola list nilai numerik:List<T>bernamavaluesuntuk menyimpan angka- Constructor yang menginisialisasi list dengan nilai yang diberikan
- Method
sum()yang mengembalikan jumlah semua nilai sebagainum - Method
min()yang mengembalikan nilai terkecil sebagaiT - Method
max()yang mengembalikan nilai terbesar sebagaiT - Method
printStats()yang menampilkan statistik dalam format yang rapi
main.dart: Impor file stats-mu dan tunjukkan class generik berbatasan dengan tipe numerik yang berbeda:- Buat
Stats<int>dengan nilai[10, 25, 5, 30, 15]dan panggilprintStats() - Cetak satu baris kosong
- Buat
Stats<double>dengan nilai[3.5, 1.2, 4.8, 2.1]dan panggilprintStats()
- Buat
Method printStats() harus menampilkan tiga baris yang menunjukkan jumlah, nilai minimum, dan nilai maksimum. Karena T extends num, kamu dapat menggunakan operator perbandingan dan operasi aritmetika pada nilai-nilai tersebut dengan aman. Hal ini tidak mungkin dilakukan dengan tipe generik yang tidak memiliki batasan.
Output yang diharapkan:
Sum: 85
Min: 5
Max: 30
Sum: 11.6
Min: 1.2
Max: 4.8Coba sendiri
import 'stats.dart';
void main() {
// TODO: Buat Stats<int> dengan nilai [10, 25, 5, 30, 15]
// lalu panggil printStats()
// TODO: Cetak baris kosong
// TODO: Buat Stats<double> dengan nilai [3.5, 1.2, 4.8, 2.1]
// lalu panggil printStats()
}
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