Hum structure ko memorize karne ki bajay derive karte hain.
Step 1 — responsibilities ko naam do. Ek car ko start() karna hoga. Starting ke liye ignition logic chahiye. Kyun split karein? Kyunki ignition ek self-contained concept hai jo independently change ho sakta hai (petrol vs electric).
Step 2 — sub-responsibility ko uski apni class do.
class Engine: def __init__(self, horsepower): self.horsepower = horsepower def ignite(self): return f"Engine roaring at {self.horsepower}hp"
Yeh step kyun? Hum volatile part ko isolate karte hain taki Car kabhi uske internals ko na chhuye.
Step 3 — Car ek Engine HOLD karta hai (composition) aur delegate karta hai.
class Car: def __init__(self, engine): # engine passed IN self.engine = engine # the has-a field def start(self): return "Car: " + self.engine.ignite() # delegation
Kyun pass in karo (dependency injection)? Taki hum koi bhi engine de sakein — petrol, electric, mock — Car ko edit kiye bina.
Step 4 — use karo.
c = Car(Engine(120))print(c.start()) # Car: Engine roaring at 120hpc.engine = Engine(300) # swap at runtime — inheritance ke saath impossible!
LEGO imagine karo. Inheritance aise hai jaise kehna "ek race-car ek special kind of car hai" — wahi toy hai, bas fancy. Composition aise hai jaise car ko alag LEGO pieces se banana: wheels, ek engine block, ek seat. Agar engine pasand nahi, tum use pop off karo aur naya click in karo — poori car rebuild nahi karni. Yahi pop-and-swap hai jis wajah se builders composition love karte hain: car sirf ek engine rakhti hai, woh ek ban nahi jaati.
"has-a" — ek class doosri class ko field ke roop mein hold karta hai aur usse delegate karta hai.
Inheritance kaunsi relationship model karta hai?
"is-a" — subclass superclass ka ek type hota hai aur uski jagah substitute hone ke kaam aana chahiye.
Is-a vs has-a ka English test kya hai?
"A is a B" vs "A has a B" zyaar se padho; jo grammatically sach lage woh chuno.
"Favor composition over inheritance" kyun advise kiya jaata hai?
Composition ek choti public interface ke through loosely couple karta hai; inheritance parent ke internals se tightly couple karta hai aur parent changes pe break ho jaata hai (fragile base class).
class Stack(list) ek bura is-a design kyun hai?
Yeh list ka pura interface (insert, indexing, slicing) inherit kar leta hai, users ko LIFO violate karne deta hai. Has-a + ek hidden list use karo.
Composition combinatorial class explosion se kaise bachata hai?
Behaviors swappable part-objects ban jaate hain jo runtime pe mix hote hain, toh har combination ke liye alag class nahi chahiye.
Delegation kya hai?
Ek method kaam ko ek held object ko forward karta hai, jaise Car.start()self.engine.ignite() call karta hai.
Inheritance ko kaunsa deep type rule satisfy karna chahiye?
Liskov substitution — ek subclass ko jahan bhi superclass expect ho wahan kaam karna chahiye.
Runtime advantage jo sirf composition mein hai?
Tum held part ko program run hote waqt swap kar sakte ho (car.engine = ElectricEngine()); inheritance compile time pe fixed hoti hai.