ialah hubungan — dimodelkan dengan (sebuah ). ialah hubungan — dimodelkan dengan (sebuah ). Memilih yang tepat ialah keputusan pemodelan teras.
ialah hubungan — dimodelkan dengan (sebuah ). ialah hubungan — dimodelkan dengan (sebuah ). Memilih yang tepat ialah keputusan pemodelan teras.
CarVehicleCarEngine// IS-A → inheritance
class Vehicle { void move() {} }
class Car extends Vehicle { } // a Car IS A Vehicle
// HAS-A → composition
class Engine { void start() {} }
class Car2 {
private Engine engine = new Engine(); // a Car HAS AN Engine
void start() { engine.start(); } // delegate to the part
}
Tanya: "Adakah X sejenis Y, atau X mempunyai/menggunakan Y?"
A Dog IS-A Animal → inheritance ✅
A Car HAS-A Engine → composition ✅
A Square IS-A Shape → inheritance ✅
A Manager HAS Employees → composition (a list) ✅
A Stack HAS-A list (not IS-A) → composition (see earlier pitfall) ✅
Orang-orang menggunakan warisan untuk menggunakan semula kod, bahkan ketika hubungannya benar-benar has-a. Jika anda tidak boleh menggantikan subkelas untuk asas di mana-mana, kemungkinan ia bukan is-a — gunakan komposisi.
Perbezaan ini ialah peraturan keputusan praktikal di sebalik "favor composition over inheritance": pilih hubungan yang benar, bukan yang menghemat beberapa baris.
Mengerjakannya dengan betul mengekalkan hierarki cetek dan jujur, dan ia mencegah pelanggaran Liskov di mana "subjenis" sebenarnya tidak dapat berdiri untuk induknya.