Is-a je vztah typu type — modelovaný pomocí dědičnosti (Car ). je vztah typu — modelovaný pomocí ( ). Výběr správného je základní modelovací rozhodnutí.
Is-a je vztah typu type — modelovaný pomocí dědičnosti (Car ). je vztah typu — modelovaný pomocí ( ). Výběr správného je základní modelovací rozhodnutí.
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
}
Otázka: "Je X druhem Y, nebo X má/používá 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) ✅
Lidé se uchylují k dědičnosti pro znovupoužití kódu, i když je vztah opravdu has-a. Pokud byste nemohli nikdy nahradit podtřídu za základnu všude, pravděpodobně to není is-a — použijte kompozici.
Tento rozdíl je praktickým rozhodovacím pravidlem za "upřednostňujte kompozici před dědičností": vyberte vztah, který je pravdivý, ne ten, který ušetří pár řádků.
Dosažení správné volby udržuje hierarchie mělké a poctivé a zabraňuje porušením Liskovova principu, kde "podtyp" nemůže skutečně nahradit svého rodiče.