Dziedziczenie pozwala klasie (podklasie lub child) ponownie używać i rozszerzać pola i metody innej klasy (superklasy lub parent). Modeluje relację is-a: Dog jest Animal.
Dziedziczenie pozwala klasie (podklasie lub child) ponownie używać i rozszerzać pola i metody innej klasy (superklasy lub parent). Modeluje relację is-a: Dog jest Animal.
class Animal:
def __init__(self, name):
self.name = name
def eat(self):
return f"{self.name} is eating"
class Dog(Animal): # Dog inherits everything from Animal
def bark(self): # ...and adds new behavior
return "Woof!"
d = Dog("Rex")
print(d.eat()) # "Rex is eating" → inherited, not rewritten
print(d.bark()) # "Woof!" → Dog-specific
Dog otrzymała __init__ i eat za darmo i dodała bark. Podklasa może również przesłonić odziedziczone metody, aby zmienić zachowanie.
| Korzyść | Ryzyko |
|---|---|
| Ponowne użycie wspólnego kodu | Ścisłe sprzężenie z klasą nadrzędną |
| Modelowanie prawdziwych hierarchii | Kruchą klasę bazową — zmiany w rodzicu psują dzieci |
| Polimorfizm poprzez wspólny typ | Głębokie drzewa stają się trudne do śledzenia |
Zagotowana wytyczna: faworyzuj kompozycję zamiast dziedziczenia gdy relacja jest naprawdę "has-a", a nie "is-a".
Dziedziczenie jest najbardziej niewłaściwie używanym cechą OOP: kuszące jest używanie go tylko do udostępniania kodu, co łączy powiązane klasy.
Poprawnie używane — tylko dla prawdziwych relacji is-a — daje ci ponowne użycie plus polimorfizm, pozwalając traktować wiele podtypów jednorodnie poprzez ich wspólnego rodzica.
Biblioteka pytań rekrutacyjnych IT ze szczegółowymi odpowiedziami — od Juniora do Seniora.
Wesprzyj