— это отношение — моделируется через ( ). — это отношение — моделируется через ( ). Выбрать правильное — это ключевое решение при моделировании.
— это отношение — моделируется через ( ). — это отношение — моделируется через ( ). Выбрать правильное — это ключевое решение при моделировании.
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
}
Спросите себя: "Является ли X разновидностью Y, или X имеет 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) ✅
Разработчики часто выбирают inheritance ради переиспользования кода, даже когда отношение на самом деле is-a. Если вы никогда не заменили бы подкласс базовым классом везде, это, вероятно, не is-a — используйте composition.
Это различие — практическое правило решения за фразой "предпочитайте composition вместо inheritance": выбирайте отношение, которое правда, а не то, которое экономит несколько строк.
Правильный выбор сохраняет иерархии плоскими и честными и предотвращает нарушения принципа Лискова, когда "подтип" не может заменить своего родителя.