Lezione Simulata
Ereditarietà
Introduzione: Cos'è l'Ereditarietà?
L'ereditarietà è uno dei pilastri della Programmazione Orientata agli Oggetti (OOP). Permette a una nuova classe (detta sottoclasse o classe figlia) di acquisire (ereditare) le caratteristiche (attributi) e i comportamenti (metodi) di una classe esistente (detta superclasse o classe madre). Immagina una relazione "genitore-figlio" tra classi.
Perché Usare l'Ereditarietà? I Vantaggi
L'ereditarietà offre vantaggi significativi:
Riuso del Codice: Evita di riscrivere codice comune, inserendolo nella superclasse.
Estendibilità: Le sottoclassi possono aggiungere nuove funzionalità specifiche.
Organizzazione Gerarchica: Modella relazioni "è un tipo di", rendendo il codice più comprensibile.
Polimorfismo: Apre la strada a comportamenti flessibili, che vedremo in seguito.
Terminologia Fondamentale
Superclasse: La classe da cui si eredita.
Sottoclasse: La classe che eredita.
La relazione è unidirezionale: la sottoclasse conosce la sua superclasse, ma non viceversa.
La Sintassi: La Parola Chiave extends
In Java, per stabilire una relazione di ereditarietà tra due classi, si utilizza la parola chiave extends. La sottoclasse "estende" la superclasse.
Esempio Pratico: La Superclasse Animale
Creiamo una superclasse generica Animale che definisce caratteristiche e comportamenti comuni a tutti gli animali.
Esempio Pratico: La Sottoclasse Cane
Ora creiamo una sottoclasse Cane che eredita da Animale, e aggiunge attributi e metodi specifici.
Utilizzo delle Classi: Creare Oggetti
Vediamo come creare oggetti e usare i metodi ereditati e specifici.
Modificatori di Accesso e Ereditarietà
I modificatori determinano cosa una sottoclasse può vedere o usare della superclasse: public, protected, default, private.
La Parola Chiave super (Costruttori)
super viene usato per chiamare il costruttore della superclasse dalla sottoclasse.
La Parola Chiave super (Metodi e Attributi)
super permette di accedere a metodi o attributi della superclasse, anche se sono stati ridefiniti.
Overriding dei Metodi (Sovrascrittura)
Una sottoclasse può fornire una propria versione di un metodo ereditato. Usa @Override per chiarezza e sicurezza.
L'Annotazione @Override
Aiuta il compilatore a rilevare errori nel sovrascrivere metodi. Obbliga a usare nomi e firme corretti.
Tipi di Ereditarietà in Java
Java supporta ereditarietà singola, multilivello e gerarchica, ma non l'ereditarietà multipla tra classi.
Esempio Pratico: Gerarchia di Veicolo
Una superclasse Veicolo con due sottoclassi: Automobile e Bicicletta, che ridefiniscono il metodo start().
Quando NON Usare l'Ereditarietà
Se la relazione è "HA UN" invece di "È UN", preferisci la **composizione**. Es: Automobile ha un Motore, non è un Motore.
Riepilogo dei Vantaggi
Riusabilità, Estendibilità, Mantenibilità, Chiarezza, e Polimorfismo sono tra i principali benefici dell’ereditarietà.