Is-a ایک قسم کا رشتہ ہے — وراثت کے ساتھ ماڈل کیا گیا (Car ایک )۔ ایک کا رشتہ ہے — کے ساتھ ماڈل کیا گیا ( کے پاس ایک )۔ صحیح انتخاب کرنا ایک بنیادی ماڈلنگ فیصلہ ہے۔
Is-a ایک قسم کا رشتہ ہے — وراثت کے ساتھ ماڈل کیا گیا (Car ایک )۔ ایک کا رشتہ ہے — کے ساتھ ماڈل کیا گیا ( کے پاس ایک )۔ صحیح انتخاب کرنا ایک بنیادی ماڈلنگ فیصلہ ہے۔
VehicleCarEngine// 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) ✅
لوگ کوڈ دوبارہ استعمال کرنے کے لیے وراثت کی طرف جاتے ہیں، یہاں تک کہ جب رشتہ واقعی has-a ہو۔ اگر آپ کبھی subclass کو ہر جگہ base کی جگہ متبادل نہ کریں، تو یہ شاید is-a نہیں ہے — composition استعمال کریں۔
یہ فرق "composition کو inheritance پر ترجیح دو" کے پیچھے عملی فیصلہ کا اصول ہے: وہ رشتہ منتخب کریں جو سچ ہے، وہ نہیں جو کچھ لائنیں بچاتا ہے۔
اس کو صحیح طریقے سے حاصل کرنا hierarchies کو سطحی اور ایمانداری سے رکھتا ہے، اور یہ Liskov کی خلاف ورزیوں سے بچاتا ہے جہاں ایک "subtype" اپنی parent کی جگہ نہیں لے سکتا۔