Composition vs Inheritance
The Is-A vs Has-A Relationship
ááŤáááąáŹáˇ OOP áážáŹ áĄááąá¸ááŤáá˛áˇ Design Decision ááŤá Bro á Class áá˝áą ááąáŹááşáá˛áˇáĄá፠áááşááᯠáááşá ááşááá˛áááŻáᏠááŻáśá¸ááźááşááááşá
áááşá¸áááşá¸ áážá áşááťááŻá¸ áážááááş: Inheritance (áĄáá˝áąáááşááśááźááşá¸) áá˛áˇ Composition (áĄá áááşáĄáááŻááşá¸áá˝áą ááąáŤááşá¸á ááşááźááşá¸)á
1. Inheritance (áĄáá˝áąáááşááśááźááşá¸) - The Is-A Relationship
ááŤáááąáŹáˇ Bro ááááźáŽá¸ááŹá¸ááźá áşáááˇáş Parent áá˛áˇ Child áááşááśááąá¸ááťááŻá¸áá˛á
Keyword: Is-A (áĽááᏠ- Dog is an Animal).
áĄáŹá¸ááŹááťááş:
- Code áá˝áąááᯠáááşááŤáááşá፠áááąá¸áááąáŹáˇáá°á¸ (DRY - Don't Repeat Yourself)á
áĄáŹá¸áááşá¸ááťááş:
- Tight Coupling ááźá áşáááşá áááŻáááŻááŹá Parent Class áážáŹ áá áşááŻáᯠááźááşáááŻááşáááş Child Class áá˝áąáážáŹá፠áááŻááşááźáŽá¸ Error áááşááŹá ááźáąáŹááşá¸áá˛áá˝áŹá¸ááŹáá˝áą ááźá áşáááŻááşáááşá ááźááşááááşáááşá
áĽááᏠ(Real World):
Bro á Human áááŻáá˛áˇ Class áá˛áááą áááşá¸áááşááŹáá˛áˇ Programmer áááŻááŤá ááŻáˇá Human ááŻááşáááşááŹáážááşáááťáž (á áŹá¸áááşá áĄáááşáááş) Bro áááşá¸ ááŻááşáááşáááşá ááźáŽá¸ááž Code ááąá¸áᏠáááşááźááˇáşááŹá¸ááŹá
class Human:
def sleep(self):
print("zzz..")
class Programmer(Human): # Programmer á Human ááŽá áĄáá˝áąáá°áááŻááşááŹ
def code(self):
print("Writing the Python codes")
# Programmer is a Human2. Composition (áĄá áááşáĄáááŻááşá¸áá˝áą ááąáŤááşá¸á ááşááźááşá¸) - The Has-A Relationship
ááŤáááąáŹáˇ ááŽááąáˇááąááş áááŹááźáŽá¸áá˝áą áááŻááźááŻááşáá˛áˇ áááşá¸áááşá¸ááąáŤáˇá Lego áááşááááŻááťááŻá¸á
Keyword: Has-A (áĽááᏠ- Car has an Engine).
áĄáŹá¸ááŹááťááş:
- Loose Coupling ááźá áşáááşá áááŻááťááşáá˛áˇ áĄá áááşáĄáááŻááşá¸ááᯠááźáŻááşáááşáááŹá áĄáá áşáá˛ááᏠáĄáááşá¸áá˝ááşáááşá Engine ááťááşáááş ááŹá¸áá áşá áŽá¸ááŻáśá¸ ááťááşá ááŹááááŻáá°á¸á Engine áá˛áááŻááşááŻáśáá˛á
áĄáŹá¸áááşá¸ááťááş:
- Code áááşá¸áááşá¸ áááŻááąá¸ááááŻááşáááşá
áĽááᏠ(Real World):
Bro áážáŹ Laptop áá áşááŻáśá¸áážááááşá Laptop á Computer Class áááą áá˝áąá¸áá˝áŹá¸ááŹáᏠáááŻááşáá°á¸á Laptop áá˛áážáŹ CPU áážááááşá RAM áážááááşá Battery áážááááşá áĄá˛áˇááŤáá˝áąááᯠááąáŤááşá¸á ááş (Compose) ááŻááşááŹá¸ááŹá
class Engine:
def start(self):
print("Vroom! Engine áááŻá¸ááźáŽ")
class Car:
def __init__(self):
self.engine = Engine() # Car áá˛áážáŹ Engine ááᯠáááŻááşáááŻááşááŹá¸áᏠ(Has-A)
def drive(self):
self.engine.start() # Engine ááᯠáážááşá¸áááŻááşá¸áááŻááşááŹ
print("ááŹá¸ááąáŹááşá¸áá˝ááşááźáŽ...")
# Car has an EngineThe Battle: áááşááŹááᯠáá˝áąá¸ááá˛?
ááŽááąááŹáážáŹ áĄááąá¸ááźáŽá¸ááŻáśá¸ Design Principle áá áşááŻááᯠáážááşááŹá¸ááąá¸ááŤá
ááŹáááŻáˇáá˛áááŻááąáŹáˇ...
Inheritance á Rigid (ááąáŹááˇáşáááşá¸) áááş:
Bro á ááááşá¸ááąá¸áááşáááŻááŤá ááŻáˇá Bird (áážááş) áááŻáá˛áˇ Class ááąáŹááşáááşá áĄá˛áˇáĄáąáŹááşáážáŹ Eagle (áááşá¸ááŻááş) áá˛áˇ Penguin (áááşáá˝ááşá¸) ááŹá¸áááŻááşáááşá Bird Class áážáŹ fly() (ááťáśáááş) áááŻáá˛áˇ function áááˇáşáááŻááşáááş... ááźáżááŹá áááşáá˝ááşá¸á áááťáśáááşáá°á¸ááąá áĄá˛áˇááąáŹáˇ áááşáá˝ááşá¸á ááááŻáĄááşáᲠfly() ááᯠáĄáá˝áąáááąááąáŹá Code áá˝áą áážáŻááşááŻááşááąáŹá
Composition á Flexible (ááźáąáŹááşá¸áá˝ááşááźááşáá˝ááş) ááźá áşáááş:
ááŽááąáŹáˇ Composition áá˛áˇ á ááşá¸á áŹá¸áááşá Penguin class áá˛áážáŹ SwimmingSkill áááŻáá˛áˇ Class ááᯠáááˇáşááąá¸áááŻááşáááşá Eagle class áá˛áážáŹ FlyingSkill ááᯠáááˇáşáááşá áááŻááťááşááŹáááŻáᲠáá˝áąá¸áááˇáş (Compose) ááŻááşáááŻáˇááá˝áŹá¸ááźáŽá áááşááąáŹááş áááŻááşáá˛!
áĄáážá áşááťáŻááş
| áĄááźáąáĄááą | ááŹááŻáśá¸ááá˛? | ááŹáááŻáˇáá˛? |
|---|---|---|
| Is-A (áĄááťááŻá¸áĄá áŹá¸áá°áááş) | Inheritance | áĽááᏠ- Cat is an Animal. (ááźáąáŹááşáᏠáááá ášááŹááşáĄááťááŻá¸áĄá áŹá¸áááŻáˇáááŻáˇ) |
| Has-A (áááŻááşáááŻááşáááş) | Composition | áĽááᏠ- User has a Database. (User á Database áĄááťááŻá¸áĄá áŹá¸ áááŻááşáá°á¸á Database ááᯠááŻáśá¸áážáŹáááŻáˇáááŻáˇ) |
| Behavior áá˝áą áá˝á˛ááźáŹá¸áááş | Composition | áĽááᏠ- áážááşáááŻááşá¸ áááťáśáááşáá°á¸á ááŤá¸áááŻááşá¸ ááąááá°á¸áááşáá°á¸ áááŻáááş Skill áá˝áąááᯠáá˝á˛ááŻááşááźáŽá¸ ááąáŤááşá¸á ááşáᏠáááŻááąáŹááşá¸áááşá |
ááááŻáśá¸
áá˛... ááŤáááąáŹáˇ Composition vs Inheritance áá˛áˇ áĄáážá áşááťáŻááşááŤáá˛á
- Inheritance: Is-A relationship, Code reusability ááąáŹááşá¸áááş, ááŤááąáááˇáş Tight Coupling ááźá áşáááşá
- Composition: Has-A relationship, Flexible ááźá áşáááş, Loose Coupling ááźá áşáááş, áĄááŻááşáá˝ááşáážáŹ áááŻááŻáśá¸ááźáááşá
- Suggestion: Favor Composition over Inheritance!