Menu
CoddyTech

Komposisi vs Pewarisan

Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 76 dari 104.

Saat merancang hubungan antarkelas, kamu memiliki dua pilihan utama: pewarisan ("is-a") dan komposisi ("has-a"). Memilih pendekatan yang tepat sangat memengaruhi fleksibilitas dan kemudahan pemeliharaan kodemu.

Pewarisan menciptakan keterikatan erat antara class. Car yang mewarisi dari Vehicle terikat secara permanen pada hubungan tersebut:

class Vehicle {
public:
    virtual void start() { std::cout << "Starting vehicle\n"; }
};

class Car : public Vehicle {
public:
    void start() override { std::cout << "Starting car\n"; }
};

Komposisi menyematkan object sebagai anggota, sehingga menciptakan hubungan yang lebih fleksibel. Car memiliki Engine, bukan menjadi sebuah mesin:

class Engine {
public:
    void start() { std::cout << "Engine running\n"; }
};

class Car {
private:
    Engine engine;  // Car MEMILIKI Engine
public:
    void start() { engine.start(); }
};

Keunggulan utama composition adalah fleksibilitas. Kamu dapat dengan mudah mengganti komponen, mengubah perilaku saat program berjalan, atau menggabungkan beberapa kemampuan tanpa batasan hierarki class yang kaku. Dalam kebanyakan kasus, desain C++ modern lebih mengutamakan composition daripada inheritance.

Gunakan pewarisan saat ada hubungan "adalah" yang sebenarnya dan kamu membutuhkan polimorfisme. Gunakan komposisi saat kamu ingin menggunakan ulang fungsionalitas atau saat hubungan tersebut lebih tepat dijelaskan sebagai "memiliki" atau "menggunakan".

challenge icon

Tantangan

Mudah

Mari kita bangun simulator sistem komputer yang menunjukkan kapan harus menggunakan composition dan kapan harus menggunakan inheritance. Kamu akan memodelkan komputer yang memiliki komponen (composition), bukan menjadi sebuah komponen, untuk menunjukkan bagaimana composition memberikan fleksibilitas untuk mengganti bagian saat program berjalan.

Kamu akan menyusun kodemu dalam tiga file:

  • Components.h: Definisikan komponen individual yang dapat dimiliki sebuah komputer.

    Buat class CPU dengan std::string model dan int cores sebagai anggota private. Sediakan constructor yang menerima kedua nilai tersebut, method process() yang mencetak CPU [model] processing with [cores] cores, dan method getModel().

    Buat class Memory dengan int sizeGB sebagai anggota private. Sediakan constructor, method load() yang mencetak Loading data into [sizeGB]GB RAM, dan method getSize().

    Buat class Storage dengan std::string type (seperti "SSD" atau "HDD") dan int capacityGB sebagai anggota private. Sediakan constructor, method read() yang mencetak Reading from [capacityGB]GB [type], serta method getter untuk kedua field.

  • Computer.h: Definisikan class Computer yang menggunakan composition untuk menggabungkan komponen.

    Computer-mu harus memiliki object anggota private: sebuah CPU, sebuah Memory, dan sebuah Storage. Gunakan daftar inisialisasi constructor untuk menginisialisasi komponen-komponen ini dari parameter.

    Implementasikan method berikut:

    • boot(): mencetak Booting computer..., lalu memanggil load() pada memory, read() pada storage, dan process() pada CPU, masing-masing pada baris terpisah
    • specs(): mencetak spesifikasi komputer dalam format berikut:
      Computer Specs:
      - CPU: [model] ([cores] cores)
      - RAM: [size]GB
      - Storage: [capacity]GB [type]
  • main.cpp: Baca enam input (masing-masing pada baris terpisah):
    1. Nama model CPU (string)
    2. Jumlah core CPU (integer)
    3. Ukuran memory dalam GB (integer)
    4. Jenis storage (string, misalnya "SSD")
    5. Kapasitas storage dalam GB (integer)
    6. Sebuah perintah: "boot" atau "specs"

    Buat object komponen, lalu buat Computer menggunakan composition. Berdasarkan perintahnya, panggil boot() atau specs().

Contohnya, dengan input Intel i7, 8, 16, SSD, 512, dan boot:

Booting computer...
Loading data into 16GB RAM
Reading from 512GB SSD
CPU Intel i7 processing with 8 cores

Dengan input AMD Ryzen, 6, 32, HDD, 1000, dan specs:

Computer Specs:
- CPU: AMD Ryzen (6 cores)
- RAM: 32GB
- Storage: 1000GB HDD

Perhatikan bahwa class Computer tidak mewarisi class komponen apa pun. Class ini memuat komponen-komponen tersebut. Hubungan "has-a" ini berarti kamu dapat dengan mudah membuat komputer dengan kombinasi komponen yang berbeda, atau bahkan mengganti komponen nanti jika kamu menambahkan method setter. Fleksibilitas ini adalah keunggulan utama composition dibandingkan inheritance.

Coba sendiri

#include <iostream>
#include <string>
#include "Computer.h"

using namespace std;

int main() {
    // Baca input
    string cpuModel;
    getline(cin, cpuModel);  // Nama model CPU (mungkin mengandung spasi)
    
    int cpuCores;
    cin >> cpuCores;  // Jumlah inti CPU
    
    int memorySize;
    cin >> memorySize;  // Ukuran memori dalam GB
    
    string storageType;
    cin >> storageType;  // Jenis penyimpanan (misalnya, "SSD")
    
    int storageCapacity;
    cin >> storageCapacity;  // Kapasitas penyimpanan dalam GB
    
    string command;
    cin >> command;  // Perintah: "boot" atau "specs"

    // TODO: Buat object komponen (CPU, Memory, Storage)
    
    // TODO: Buat object Computer menggunakan komposisi
    
    // TODO: Berdasarkan perintah, panggil boot() atau specs()

    return 0;
}
quiz iconUji dirimu

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

Semua pelajaran di Pemrograman Berorientasi Object

Latihan sendiri: Compiler C++ online