Is-a er en relation af typen type — modelleret med arv ( ). er en relation af typen — modelleret med ( ). At vælge den rigtige er en kernemodelleringsbeslutning.
Is-a er en relation af typen type — modelleret med arv ( ). er en relation af typen — modelleret med ( ). At vælge den rigtige er en kernemodelleringsbeslutning.
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
}
Spørg: "Er X en slags Y, eller har X en/bruger 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) ✅
Mennersker griber til arv for at genbruge kode, selv når relationen virkelig er has-a. Hvis du aldrig kunne erstatte underklassen med basen overalt, er det sandsynligvis ikke is-a — brug komposition.
Denne skelnen er praktisk beslutningsregel bag "prefer komposition over arv": vælg det forhold, der er sandt, ikke det som sparer nogle få linjer.
At få det rigtigt holder hierarkier lavt og ærlige, og det forhindrer Liskov-overtrædelser hvor en "undertype" ikke kan stå for sin forælders plads.