2.1.15 · HinglishOOP Fundamentals

Composition — has-a relationship vs is-a

1,706 words8 min readRead in English

2.1.15 · Coding › OOP Fundamentals


Composition KYA hai?

Roz ka test:

Sentence jo natural lagta hai Relationship Tool
"A car is an engine" ❌ bakwaas
"A car has an engine" ✅ has-a composition
"A dog is an animal" ✅ is-a inheritance
"A dog has an animal" ❌ bakwaas

Composition ko prefer kyun karein? (famous principle)

Composition concretely kyun jeet ta hai:

  1. Flexibility — tum part ko runtime pe swap kar sakte ho (car.engine = ElectricEngine()).
  2. No combinatorial explosion — ek FlyingSwimmingRobot ko ek alag class ki zaroorat nahi; use ek Flyer part aur ek Swimmer part do.
  3. Encapsulation — part ke guts hidden rehte hain.

Scratch se derive karna: "Car has-a Engine" banana

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 120hp
c.engine = Engine(300)   # swap at runtime — inheritance ke saath impossible!
Figure — Composition — has-a relationship vs is-a

Worked examples


Common mistakes (Steel-manned)


Recall Feynman: ek 12-saal ke bacche ko samjhao

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.


Flashcards

Composition kaunsi relationship model karta hai?
"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.

Connections

  • Inheritance — is-a relationship
  • Liskov Substitution Principle
  • Encapsulation and Information Hiding
  • Dependency Injection
  • Strategy Pattern (composition of swappable behaviors)
  • Aggregation vs Composition (UML)
  • Fragile Base Class Problem

Concept Map

has-a

is-a

decides

mirrors

justifies

holds part as

couples

couples

risks

enables

leads to

motivates

New class design question

Composition

Inheritance

English grammar test

Liskov substitutability

Field + delegation

Loose coupling

Tight coupling

Fragile base class

Swap, no explosion, encapsulation

Favor composition over inheritance