egy szerinti viszony — az (inheritance) modellezzük (egy ). egy viszony — az (composition) modellezzük (egy -nel). A helyes választás a modellezés alapvető döntése.
egy szerinti viszony — az (inheritance) modellezzük (egy ). egy viszony — az (composition) modellezzük (egy -nel). A helyes választás a modellezés alapvető döntése.
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
}
Kérdezd meg: "Az X egy fajtája-e az Y-nak, vagy az X rendelkezik/használ egy Y-t?"
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) ✅
Az emberek az öröklödéshez nyúlnak kódújrahasznosítás céljából, még akkor is, amikor a viszony valójában has-a. Ha soha nem helyettesítenéd a alosztályt az alap helyén mindenhol, valószínűleg nem is-a — használj összetételt.
Ez a különbség a "favor composition over inheritance" (részesítsd előnyben az összetételt az öröklödéssel szemben) mögötti gyakorlati döntési szabály: válaszd azt a viszonyt, amely igaz, nem azt, amely megtakarít néhány sort.
A helyes választás sekély és őszinte hierarchiákat tart fenn, és megelőzi a Liskov sérüléseket, ahol egy "szubtípus" valójában nem helyettesítheti a szülőjét.