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 কি 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" প্রকৃতপক্ষে তার পিতার জায়গায় দাঁড়াতে পারে না।