Menu
CoddyTech

Kelas Generik

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 65 dari 110.

Kamu sudah melihat bagaimana koleksi bawaan Dart seperti List<String> menggunakan parameter tipe. Sekarang saatnya membuat class generikmu sendiri yang berfungsi dengan tipe apa pun yang kamu tentukan.

class generik menggunakan parameter tipe (biasanya T) sebagai placeholder untuk tipe sebenarnya yang akan diberikan saat membuat sebuah instance:

class Box<T> {
  T content;
  
  Box(this.content);
  
  T getContent() => content;
}

void main() {
  var stringBox = Box<String>('Hello');
  var intBox = Box<int>(42);
  
  print(stringBox.getContent());  // Hello
  print(intBox.getContent());     // 42
}

T berfungsi sebagai variabel tipe. Saat kamu membuat Box<String>, setiap T di dalam class menjadi String. Dengan begitu, kamu mendapatkan keamanan tipe tanpa perlu menulis class terpisah untuk setiap tipe.

Kamu bisa menggunakan beberapa parameter tipe saat class-mu perlu bekerja dengan lebih dari satu tipe:

class Pair<K, V> {
  K first;
  V second;
  
  Pair(this.first, this.second);
}

void main() {
  var pair = Pair<String, int>('age', 25);
  print('${pair.first}: ${pair.second}');  // age: 25
}

class generik adalah fondasi untuk kode yang dapat digunakan kembali dan aman dari segi tipe. Daripada menggandakan logika untuk berbagai tipe atau kehilangan informasi tipe dengan dynamic, generik memungkinkan kamu menulis kode fleksibel yang tetap dapat diperiksa oleh compiler.

challenge icon

Tantangan

Mudah

Mari kita buat sistem pembungkus hadiah yang menggunakan class generik untuk membuat wadah fleksibel bagi berbagai jenis barang. Kamu akan membuat class generik Wrapper yang dapat membungkus konten dengan tipe apa pun, dan class GiftBox dengan dua parameter tipe untuk memasangkan hadiah dengan pesan kartu.

Kamu akan mengatur kodemu ke dalam dua file:

  • wrapper.dart: Definisikan class generikmu di sini:
    • Class generik Wrapper<T> dengan property T content dan sebuah constructor. Sertakan method unwrap() yang mengembalikan konten, serta method describe() yang mencetak Wrapped: [content]
    • Class generik GiftBox<G, C> dengan dua property: G gift dan C card. Sertakan sebuah constructor dan method open() yang mencetak Gift: [gift] pada satu baris dan Card: [card] pada baris berikutnya
  • main.dart: Impor file wrapper-mu dan tunjukkan penggunaan class generik dengan berbagai tipe:
    • Buat Wrapper<String> yang berisi 'Chocolate' dan panggil describe()
    • Buat Wrapper<int> yang berisi 42 dan panggil describe()
    • Buat Wrapper<double> yang berisi 3.14 dan panggil describe()
    • Cetak satu baris kosong
    • Buat GiftBox<String, String> dengan hadiah 'Teddy Bear' dan kartu 'Happy Birthday!', lalu panggil open()
    • Cetak satu baris kosong
    • Buat GiftBox<int, String> dengan hadiah 100 (yang mewakili jumlah uang pada kartu hadiah) dan kartu 'Congratulations!', lalu panggil open()

Perhatikan bagaimana class Wrapper yang sama dapat digunakan dengan string, bilangan bulat, dan bilangan desimal. Class GiftBox menunjukkan penggunaan dua parameter tipe untuk memasangkan berbagai tipe, hadiah dapat memiliki tipe apa pun, sedangkan pesan kartu tetap berupa string.

Output yang diharapkan:

Wrapped: Chocolate
Wrapped: 42
Wrapped: 3.14

Gift: Teddy Bear
Card: Happy Birthday!

Gift: 100
Card: Congratulations!

Coba sendiri

import 'wrapper.dart';

void main() {
  // TODO: Buat Wrapper<String> berisi 'Chocolate' lalu panggil describe()
  
  // TODO: Buat Wrapper<int> berisi 42 lalu panggil describe()
  
  // TODO: Buat Wrapper<double> berisi 3.14 lalu panggil describe()
  
  // TODO: Cetak baris kosong
  
  // TODO: Buat GiftBox<String, String> dengan hadiah 'Teddy Bear' 
  // dan kartu 'Happy Birthday!', lalu panggil open()
  
  // TODO: Cetak baris kosong
  
  // TODO: Buat GiftBox<int, String> dengan hadiah 100 
  // dan kartu 'Congratulations!', lalu panggil open()
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Dart online