è una relazione di — modellata con (una ). è una relazione di — modellata con (una ). Scegliere quella giusta è una decisione di modellazione fondamentale.
è una relazione di — modellata con (una ). è una relazione di — modellata con (una ). Scegliere quella giusta è una decisione di modellazione fondamentale.
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
}
Domandati: "X è un tipo di Y, oppure X ha/usa un 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) ✅
Molti ricorrono all'inheritance per riusare il codice, anche quando la relazione è in realtà has-a. Se non sostituiresti la sottoclasse alla classe base ovunque, probabilmente non è is-a — usa la composition.
Questa distinzione è la regola decisionale pratica dietro "favor composition over inheritance": scegli la relazione che è vera, non quella che risparmia qualche riga di codice.
Farlo correttamente mantiene le gerarchie shallow e coerenti, e previene violazioni di Liskov dove un "sottotipo" non può effettivamente stare al posto del suo genitore.
Una raccolta di domande di colloquio IT con risposte dettagliate — da Junior a Senior.
Dona