Is-a એ type નો સંબંધ છે — જે inheritance સાથે મોડેલ કરવામાં આવે છે (એક ). એ નો સંબંધ છે — જે સાથે મોડેલ કરવામાં આવે છે (એક ). સાચો પસંદ કરવો એ મોડલિંગનો મુખ્ય નિર્ણય છે.
Is-a એ type નો સંબંધ છે — જે 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 a kind of Y છે, અથવા X have/use a 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 reuse કરવા માટે inheritance તરફ દોઠણ કરે છે, ભલે સંબંધ ખરેખર has-a હોય. જો તમે subclass ને base ની જગ્યાએ ક્યાંય substitute ન કરી શક્તા હોત, તો તે બંદ is-a નથી — composition વાપરો.
યો તફાવત "favor composition over inheritance" પાછળનો વ્યવહારિક નિર્ણય નિયમ છે: તે સંબંધ પસંદ કરો જે સાચો છે, તે નહીં જે થોડી લીટીઓ બચાવે છે.
તેને સાચું મેળવવું પરિમાણો ને ઓછો અને સત્ય રાખે છે, અને તે Liskov ઉલ્લંઘનોને રોકે છે જ્યાં