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".
Tantangan
MudahMari 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
CPUdenganstd::string modeldanint coressebagai anggota private. Sediakan constructor yang menerima kedua nilai tersebut, methodprocess()yang mencetakCPU [model] processing with [cores] cores, dan methodgetModel().Buat class
Memorydenganint sizeGBsebagai anggota private. Sediakan constructor, methodload()yang mencetakLoading data into [sizeGB]GB RAM, dan methodgetSize().Buat class
Storagedenganstd::string type(seperti "SSD" atau "HDD") danint capacityGBsebagai anggota private. Sediakan constructor, methodread()yang mencetakReading from [capacityGB]GB [type], serta method getter untuk kedua field.Computer.h: Definisikan classComputeryang menggunakan composition untuk menggabungkan komponen.Computer-mu harus memiliki object anggota private: sebuahCPU, sebuahMemory, dan sebuahStorage. Gunakan daftar inisialisasi constructor untuk menginisialisasi komponen-komponen ini dari parameter.Implementasikan method berikut:
boot(): mencetakBooting computer..., lalu memanggilload()pada memory,read()pada storage, danprocess()pada CPU, masing-masing pada baris terpisahspecs(): 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):- Nama model CPU (string)
- Jumlah core CPU (integer)
- Ukuran memory dalam GB (integer)
- Jenis storage (string, misalnya "SSD")
- Kapasitas storage dalam GB (integer)
- Sebuah perintah: "boot" atau "specs"
Buat object komponen, lalu buat
Computermenggunakan composition. Berdasarkan perintahnya, panggilboot()atauspecs().
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 coresDengan input AMD Ryzen, 6, 32, HDD, 1000, dan specs:
Computer Specs:
- CPU: AMD Ryzen (6 cores)
- RAM: 32GB
- Storage: 1000GB HDDPerhatikan 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;
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Dasar-Dasar OOP
File EksternalBuild dan Kompilasi C++File Header dan File SourceNamespace dan CakupanPengantar OOP dalam C++class vs objectPointer 'this'method (Fungsi Anggota)Atribut (Anggota Data)Dasar Ctor dan DtorRingkasan: Kalkulator Sederhana4Properti class
Anggota instance vs staticGetter dan setterFungsi anggota constKata kunci mutableMethod dan variabel staticFungsi dan class friendRangkuman, Pengelola Rekening Bank7Pewarisan
Pewarisan DasarTingkat Akses pada PewarisanUrutan Pemanggilan Ctor & DtorPenimpaan methodFungsi Virtual & VTablePewarisan BergandaPewarisan VirtualRangkuman: Hierarki Karyawan2Manajemen Memori
Memori Stack vs HeapPointer dan ReferenceMemori Dinamis (new/delete)Smart Pointer di C++RAII di C++Rangkuman: Pengelola Array Dinamis5Enkapsulasi
Penentu Akses dalam C++Penentu Akses secara MendalamPenyembunyian Informasistruct vs classNested dan Inner classRangkuman, Sistem Catatan Siswa8Polimorfisme
Polimorfisme saat Compile vs RuntimeOverloading FungsiMeninjau Kembali Fungsi VirtualFungsi Virtual MurniKelas AbstrakDesain Interface di C++Casting Dinamis & RTTIRangkuman: Kalkulator Bentuk11Konsep OOP Lanjutan
Komposisi vs PewarisanMixin melalui CRTPIdiom PimplPenghapusan TipeKelas Enum dan Pengetikan KuatPenanganan Pengecualian dalam OOPHierarki Pengecualian Kustom3Konstruktor & Destruktor
Konstruktor DefaultKonstruktor BerparameterKonstruktor SalinKonstruktor PindahDaftar Inisialisasi KonstruktorKonstruktor DelegasiKupas Tuntas DestruktorAturan Tiga, Lima, dan NolRangkuman: class String6Overloading Operator
Pengantar Overloading OperatorOverloading Operator AritmetikaOverloading Operator PerbandinganOperator StreamOverloading Operator PenugasanOverloading Operator [] dan ()Operator Konversi TipeRingkasan, class Matrix9Template
Template FungsiTemplate classSpesialisasi TemplateTemplate VariadikDasar SFINAE & Type TraitsRangkuman, Container GenerikLatihan sendiri: Compiler C++ online