L'ereditarietà consente a una classe (la sottoclasse o ) di riutilizzare ed estendere i campi e i metodi di un'altra classe (la o ). Modella una relazione : un .
L'ereditarietà consente a una classe (la sottoclasse o ) di riutilizzare ed estendere i campi e i metodi di un'altra classe (la o ). Modella una relazione : un .
DogAnimalclass 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 ha ottenuto __init__ e eat gratuitamente e ha aggiunto bark. Una sottoclasse può anche sovrascrivere i metodi ereditati per cambiare il comportamento.
| Vantaggio | Rischio |
|---|---|
| Riuso del codice condiviso | Accoppiamento stretto con la classe padre |
| Modellare gerarchie reali | Fragile base class — i cambiamenti al padre rompono i figli |
| Polimorfismo tramite un tipo comune | Gli alberi profondi diventano difficili da seguire |
Una linea guida comune: preferire la composizione all'ereditarietà quando la relazione è veramente "has-a", non "is-a".
L'ereditarietà è la funzionalità OOP più abusata: è allettante usarla solo per condividere codice, il che accoppia classi non correlate.
Usata correttamente — solo per relazioni is-a genuine — ti dà riuso più polimorfismo, permettendoti di trattare molti sottotipi uniformemente attraverso la loro classe padre comune.