Is-a je veza tipa — modelirana s nasljeđivanjem (a Car ). je veza — modelirana s (a ). Odabir ispravne je osnovna odluka pri modeliranju.
Is-a je veza tipa — modelirana s nasljeđivanjem (a Car ). je veza — modelirana s (a ). Odabir ispravne je osnovna odluka pri modeliranju.
VehicleCarEngine// 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
}
Pitajte: "Je li X vrsta od Y, ili X ima/koristi 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) ✅
Ljudi posežu za nasljeđivanjem da ponovno koriste kod, čak i kada je veza zapravo has-a. Ako nikada ne biste zamijenili podklasu baznom klasu svugdje, vjerojatno nije is-a — koristite kompoziciju.
Ova razlika je praktično pravilo odluke iza "preferiranja kompozicije nad nasljeđivanjem": odaberite veza koja je točna, ne onu koja štedi nekoliko linija.
Ispravna veza čini hijerarhije plitkim i iskrenim, te sprječava Liskovljeve povrede gdje "podtip" zapravo ne može biti zamjena za svoju roditeljsku klasu.