<aside> <img src="notion://custom_emoji/899aa73c-260f-813c-baa9-0003a270e9e6/29eaa73c-260f-8057-931f-007a0ac7402b" alt="notion://custom_emoji/899aa73c-260f-813c-baa9-0003a270e9e6/29eaa73c-260f-8057-931f-007a0ac7402b" width="40px" />
Indice
</aside>
<aside> 🧩
Prerequisiti
<aside> 🧠
Cosa imparerai con questa lezione
Nelle lezioni precedenti abbiamo imparato una regola fondamentale: a ogni concetto corrisponde una classe.
Quando abbiamo avuto bisogno di modellare un Guerriero, abbiamo creato la classe Player. Per l’arma abbiamo creato la classe Weapon. Ogni volta che ci è servito qualcosa di nuovo, abbiamo aperto un file vuoto e abbiamo cominciato a scrivere da zero: class NomeNuovaCosa...
Questo approccio funziona benissimo quando gli oggetti sono molto diversi tra loro (ad esempio, un’arma non è una pozione). Ma cosa succede quando dobbiamo gestire oggetti che sono diversi, ma sono variazioni dello stesso concetto?
Immagina di dover programmare un videogioco spaziale. Inizi creando la tua classe generica per una nave stellare, Spaceship:
class Spaceship:
def __init__(self, name, shield):
self.name = name
self.shield = shield
self.speed = 0
def accelerate(self):
self.speed += 10
print(f"{self.name} accelera a {self.speed} parsec/h!")
Funziona benissimo. Ma ora il game designer ti dice:
"Voglio aggiungere le navi da carico (Cargo) che possono trasportare merci e i caccia stellari (Fighter) che possono sparare."
L’istinto iniziale potrebbe essere quello di creare due nuove classi distinte: CargoShip e StarFighter. Probabilmente copieresti il codice di Spaceship (perché tutte hanno un nome e uno scudo) e aggiungeresti le parti mancanti.
<aside> 🔥
Attenzione
Il copia-incolla è il nemico numero uno del programmatore (principio DRY - Don’t Repeat Yourself). Se domani decidi di cambiare la logica dell’accelerazione, dovrai ricordarti di modificarla in tre file diversi. Prima o poi ne dimenticherai uno, creando dei bug difficili da trovare.
</aside>
Per aiutarci a risolvere questo problema entra in gioco uno dei principi cardine della programmazione ad oggetti: l’Ereditarietà.
L’ereditarietà permette di creare una nuova classe che mantiene tutte le caratteristiche (attributi e metodi) di una classe esistente, aggiungendone di nuove o modificando quelle vecchie.
In termini tecnici:
Spaceship).CargoShip).