Menu
CoddyTech

Komposisi vs Pewarisan

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

Kamu telah mempelajari bahwa pewarisan menciptakan hubungan "adalah", Dog adalah Animal. Namun, ada pendekatan hebat lainnya: komposisi, yang menciptakan hubungan "memiliki". Alih-alih mewarisi perilaku, sebuah class berisi instance dari class lain dan mendelegasikan pekerjaan kepada instance tersebut.

Pertimbangkan sebuah class Car. Dengan pewarisan, kamu mungkin mencoba memperluas class Engine, tetapi mobil bukanlah mesin, mobil memiliki mesin:

class Engine {
  void start() => print('Engine started');
}

class Car {
  final Engine _engine = Engine();  // Komposisi: Car MEMILIKI Engine
  
  void start() {
    _engine.start();  // Serahkan tugas ke engine
    print('Car is ready to drive');
  }
}

void main() {
  var car = Car();
  car.start();
}

Keunggulan utama komposisi adalah fleksibilitas. Dengan pewarisan, kamu terikat pada satu class induk. Dengan komposisi, kamu bisa menggabungkan beberapa komponen dan bahkan menggantinya saat program berjalan:

class ElectricEngine {
  void start() => print('Electric motor humming');
}

class HybridCar {
  Engine? _gasEngine;
  ElectricEngine? _electricEngine;
  
  HybridCar({bool useElectric = false}) {
    if (useElectric) {
      _electricEngine = ElectricEngine();
    } else {
      _gasEngine = Engine();
    }
  }
}

Panduan umum adalah "utamakan komposisi daripada pewarisan". Gunakan pewarisan jika terdapat hubungan "adalah" yang sebenarnya dan kamu membutuhkan polimorfisme. Gunakan komposisi jika kamu ingin menggunakan kembali perilaku tanpa keterikatan yang erat, atau jika sebuah object membutuhkan kemampuan dari beberapa sumber.

challenge icon

Tantangan

Mudah

Mari bangun sistem komputer menggunakan komposisi! Alih-alih membuat komputer mewarisi bagian-bagiannya, kamu akan membuat class komponen yang terpisah lalu menggabungkannya, karena komputer memiliki CPU dan memiliki memori, bukan merupakan CPU atau memori.

Kamu akan mengatur kodemu dalam tiga file:

  • components.dart: Buat dua class komponen yang mewakili bagian-bagian komputer:
    • Class CPU dengan String brand dan double speedGHz. Sertakan method process() yang mengembalikan string: [brand] processing at [speedGHz]GHz
    • Class Memory dengan int sizeGB. Sertakan method load() yang mengembalikan string: Loading [sizeGB]GB of data
  • computer.dart: Buat class Computer yang menggunakan komposisi untuk menggabungkan komponen-komponen tersebut. Komputermu harus:
    • Memiliki field String name
    • Memuat instance CPU dan Memory (komposisi, komputer memiliki bagian-bagian ini)
    • Menerima semua nilai yang diperlukan melalui constructornya untuk membuat kedua komponen secara internal
    • Memiliki method boot() yang mendelegasikan tugas kepada kedua komponen dan mencetak tiga baris: nama komputer diikuti starting..., lalu hasil method process dari CPU, kemudian hasil method load dari Memory
    • Memiliki method specs() yang mengembalikan string untuk menjelaskan sistem: [name]: [brand] [speedGHz]GHz, [sizeGB]GB RAM
  • main.dart: Impor file-filemu dan tunjukkan cara kerja komposisi:
    • Buat Computer bernama Workstation dengan CPU Intel yang berjalan pada 3.5 GHz dan memori 16 GB
    • Panggil method boot()
    • Cetak hasil specs()

Perhatikan bahwa class Computer tidak mewarisi CPU atau Memory, class ini memuat keduanya dan mendelegasikan pekerjaan kepada keduanya. Inilah hubungan "has-a" yang dihasilkan oleh komposisi!

Output yang diharapkan:

Workstation starting...
Intel processing at 3.5GHz
Loading 16GB of data
Workstation: Intel 3.5GHz, 16GB RAM

Coba sendiri

import 'computer.dart';

void main() {
  // TODO: Buat Computer bernama "Workstation" dengan:
  // - CPU Intel yang berjalan pada 3.5 GHz
  // - Memori 16 GB

  // TODO: Panggil method boot()

  // TODO: Cetak hasil specs()
}
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