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) ✅
ਲੋਕ ਕੋਡ ਨੂੰ ਮੁੜ ਵਰਤਣ ਲਈ inheritance ਵੱਲ ਜਾਂਦੇ ਹਨ, ਭਾਵੇਂ ਸਬੰਧ ਅਸਲ ਵਿੱਚ has-a ਹੋ। ਜੇ ਤੁਸੀਂ ਕਦੇ ਵੀ subclass ਨੂੰ base ਲਈ ਹਰ ਜਗ੍ਹਾ ਬਦਲਨਾ ਨਹੀਂ ਚਾਹਦੇ, ਤਾਂ ਇਹ ਸ਼ਾਇਦ is-a ਨਹੀਂ ਹੈ — composition ਵਰਤੋ।
ਇਹ ਫਰਕ "composition ਨੂੰ inheritance ਦੇ ਉੱਪਰ ਤਰਜੀਹ ਦਿਓ" ਦੇ ਪਿੱਛੇ ਵਿਹਾਰਕ ਫੈਸਲੇ ਦਾ ਨਿਯਮ ਹੈ: ਉਹ ਸਬੰਧ ਚੁਣੋ ਜੋ ਸੱਚ ਹੈ, ਉਹ ਨਹੀਂ ਜੋ ਕੁਝ ਲਾਈਨਾਂ ਬਚਾਉਂਦਾ ਹੈ।
ਇਸ ਨੂੰ ਸਹੀ ਪ੍ਰਾਪਤ ਕਰਨਾ hierarchies ਨੂੰ ਉਥਲਾ ਅਤੇ ਸਚੇ ਰੱਖਦਾ ਹੈ, ਅਤੇ ਇਹ Liskov ਦੀ ਉਲੰਘਣਾ ਤੋਂ ਬਚਾਵ ਕਰਦਾ ਹੈ ਜਿੱਥੇ ਇੱਕ "subtype" ਅਸਲ ਵਿੱਚ ਆਪਣੇ parent ਦੀ ਜਗ੍ਹਾ ਨਹੀਂ ਲੈ ਸਕਦਾ।