एक संबंध आहे — सह मॉडेल केला जातो ( ). एक संबंध आहे — सह मॉडेल केला जातो ( ). योग्य निवड निवडणे हे मूल मॉडेलिंग निर्णय आहे.
एक संबंध आहे — सह मॉडेल केला जातो ( ). एक संबंध आहे — सह मॉडेल केला जातो ( ). योग्य निवड निवडणे हे मूल मॉडेलिंग निर्णय आहे.
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 वापरतात, जरी संबंध खरेतर has-a असतो. जर आपण subclass ला base च्या जागी सर्वत्र बदलू शकत नाही, तर ते कदाचित is-a नाही — composition वापरा.
ही फरक "favor composition over inheritance" च्या मागे असलेली व्यावहारिक निर्णय नियम आहे: संबंध निवडा जो खरा आहे, असा नाही जो काही ओळींची बचत करतो.
ते योग्यरित्या केल्याने पदानुक्रम कमी आणि प्रामाणिक राहते, आणि Liskov उल्लंघनांना प्रतिबंध करते जेथे "subtype" वास्तविकपणे त्याचे वडील बदलू शकत नाही.