Is-a एक प्रकारको सम्बन्ध हो — inheritance द्वारा मडेल गरिएको (एक )। एक को सम्बन्ध हो — द्वारा मडेल गरिएको (एक )। सही छनौट गर्नु एक मुख्य मडेलिङ निर्णय हो।
Is-a एक प्रकारको सम्बन्ध हो — inheritance द्वारा मडेल गरिएको (एक )। एक को सम्बन्ध हो — द्वारा मडेल गरिएको (एक )। सही छनौट गर्नु एक मुख्य मडेलिङ निर्णय हो।
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) ✅
मानिसहरू code पुनः प्रयोग गर्नको लागि inheritance खोज्छन्, भले पनि सम्बन्ध साँच्चै has-a हो। यदि तपाईले कहिले पनि subclass लाई base को लागि सर्वत्र प्रतिस्थापन गर्नुहुन्न, यो शायद is-a होइन — composition प्रयोग गर्नुहोस्।
यो भिन्नता "composition को पक्ष लिनुहोस् inheritance को भन्दा" को पछाडि व्यावहारिक निर्णय नियम हो: सम्बन्ध छनौट गर्नुहोस् जो सत्य हो, एक होइन जो केही लाइनहरू बचाउँछ।
यसलाई सही पाउनु पदानुक्रमहरूलाई उथले र ईमानदार राख्छ, र यो Liskov उल्लङ्घन रोकछ जहाँ एक "subtype" वास्तवमा आफ्नो अभिभाववाक को लागि खडा हुन सक्दैन।