Loading
Loading
La programmazione orientata agli oggetti è un paradigma che organizza il software intorno a «oggetti», entità che racchiudono insieme i dati (gli attributi che ne descrivono lo stato) e i comportamenti (i metodi che operano su quei dati). Studiando i quattro pilastri del paradigma — incapsulamento, ereditarietà, polimorfismo e astrazione — si impara a modellizzare problemi reali individuando classi, responsabilità e relazioni, e a scrivere codice modulare, riusabile ed estensibile. L'argomento rientra pienamente nel programma del triennio del Liceo Scientifico, opzione Scienze Applicate, ed è valutabile nell'Esame di Stato (seconda prova e colloquio).
5sezionica. 18min di lettura3competenzeLivelloBase 1 · Standard 2 · Approfondimento 2Verificato · 06/2026
livello base
È richiesto saper definire una classe con attributi, costruttore e metodi, comprendere l'incapsulamento e leggere/scrivere una semplice gerarchia di ereditarietà.
livello avanzato
L'indirizzo Scienze Applicate approfondisce il polimorfismo con overriding, le classi astratte/interfacce e la progettazione orientata agli oggetti di un problema reale, anche con cenni di notazione UML.
Lesetiefe: Approfondimento
Schriftgröße: Standard
Dalla classe agli oggetti: lo stampo e le sue istanze
Progetta la classe «ContoCorrente» con gli attributi «intestatario» e «saldo». Scrivi il costruttore e i metodi «versa(importo)» e «preleva(importo)», individuando attributi, stato e comportamento.
Lo stato dell'oggetto è descritto da due attributi d'istanza: «intestatario» (testo) e «saldo» (numero reale). Ogni conto avrà i propri valori indipendenti.
Il costruttore riceve l'intestatario e un saldo iniziale e li assegna agli attributi tramite self/this: «def __init__(self, intestatario, saldo): self.intestatario = intestatario; self.saldo = saldo». Così l'oggetto nasce già in uno stato valido.
«versa(importo)» aumenta il saldo: «self.saldo = self.saldo + importo». «preleva(importo)» lo diminuisce solo se i fondi bastano: «if importo <= self.saldo: self.saldo = self.saldo - importo». I metodi modificano lo stato dell'istanza su cui sono invocati.
«c = ContoCorrente("Rossi", 100)» crea un'istanza; «c.versa(50)» porta il saldo a 150; «c.preleva(30)» lo porta a 120. Un secondo oggetto avrebbe il proprio saldo indipendente.
Risultato: La classe incapsula stato (intestatario, saldo) e comportamento (versa, preleva); ogni istanza mantiene valori propri. Dopo le operazioni dell'esempio il saldo finale è 120.
Errori frequenti
Ripasso attivo
Progetta la classe «ContoCorrente» con gli attributi «intestatario» e «saldo». Scrivi il costruttore che inizializza l'intestatario e pone il saldo iniziale, e i metodi «versa(importo)» e «preleva(importo)». Indica chiaramente quali sono gli attributi d'istanza e quale parte del codice rappresenta lo stato e quale il comportamento dell'oggetto.
Richiamo attivo
Ricorda i punti chiave — poi rivela.
Fonti: Indicazioni Nazionali per i Licei (DPR 89/2010, DM 211/2010) — Obiettivi Specifici di Apprendimento (Ministero dell'Istruzione e del Merito (MIM))
Information hiding: interfaccia pubblica e stato privato
Rendi privato l'attributo «saldo» di «ContoCorrente» e aggiungi i metodi che impediscano un saldo negativo. Spiega il problema di integrità risolto.
In Java: «private double saldo;». In Python si usa la convenzione «self._saldo». In questo modo nessun codice esterno può scrivere direttamente «conto.saldo = -5000».
«public double getSaldo() { return saldo; }» offre la sola lettura controllata del valore, senza esporre l'attributo.
Nel metodo «preleva(importo)» si controlla la condizione di validità: si esegue il prelievo solo se «importo > 0 && importo <= saldo», altrimenti si segnala un errore e lo stato resta invariato.
Provando a prelevare un importo superiore al saldo, l'operazione viene rifiutata: il saldo non può mai diventare negativo, l'invariante della classe è garantita dall'oggetto stesso.
Risultato: L'attributo privato + il metodo validante garantiscono l'invariante «saldo >= 0»: nessun codice esterno può violare l'integrità dei dati, perché lo stato è modificabile solo tramite l'interfaccia controllata.
Errori frequenti
Ripasso attivo
Riprendi la classe «ContoCorrente». Rendi privato l'attributo «saldo» e aggiungi un getter «getSaldo()» e un setter (o un metodo «preleva») che impedisca al saldo di diventare negativo. Spiega quale problema di integrità dei dati hai risolto rendendo privato l'attributo.
Richiamo attivo
Ricorda i punti chiave — poi rivela.
Fonti: Indicazioni Nazionali per i Licei (DPR 89/2010, DM 211/2010) — Obiettivi Specifici di Apprendimento (Ministero dell'Istruzione e del Merito (MIM))
Gerarchia di ereditarietà: dalla classe base alle derivate
Modellizza «Persona» (nome, età) con le sottoclassi «Studente» (media) e «Docente» (materia). Mostra come il costruttore di «Studente» richiama quello di «Persona» e indica i membri ereditati e aggiunti.
«Persona» ha gli attributi comuni «nome» ed «età» e il costruttore «__init__(self, nome, eta)» che li inizializza, più eventuali metodi comuni (p. es. «presentati())».
«class Studente(Persona):» e «class Docente(Persona):» dichiarano l'ereditarietà. Entrambe ricevono per ereditarietà nome, età e i metodi comuni di Persona.
Nel costruttore di «Studente»: «def __init__(self, nome, eta, media): super().__init__(nome, eta); self.media = media». La chiamata a super() inizializza la parte ereditata; poi si inizializza l'attributo aggiunto «media».
Studente: ereditati nome, età (e i metodi di Persona); aggiunto «media» e i metodi specifici. Docente: ereditati nome, età; aggiunto «materia». Il codice comune vive una sola volta nella base.
Risultato: La gerarchia riusa nome/età definiti una sola volta in «Persona»; ogni sottoclasse estende lo stato comune con i propri attributi specifici, inizializzati dopo la chiamata a super(), che garantisce la corretta inizializzazione della parte ereditata.
Errori frequenti
Ripasso attivo
Modellizza una gerarchia per una scuola: una superclasse «Persona» (attributi «nome», «età») e due sottoclassi «Studente» (aggiunge «media») e «Docente» (aggiunge «materia»). Scrivi i costruttori, mostrando come quello di «Studente» richiama quello di «Persona», e indica quali membri sono ereditati e quali aggiunti.
Richiamo attivo
Ricorda i punti chiave — poi rivela.
Fonti: Indicazioni Nazionali per i Licei (DPR 89/2010, DM 211/2010) — Obiettivi Specifici di Apprendimento (Ministero dell'Istruzione e del Merito (MIM))
Polimorfismo: una superclasse astratta, molte implementazioni di area()
Cerchio
Area del cerchio in funzione del raggio r; è l'overriding di area() nella sottoclasse Cerchio.
Quadrato
Area del quadrato in funzione del lato l; è l'overriding di area() nella sottoclasse Quadrato.
Definisci «Figura» astratta con «area()» astratto e le sottoclassi «Cerchio» (raggio) e «Quadrato» (lato). Scorri una lista di figure miste e stampane l'area; calcola l'area per un cerchio di raggio 2 e un quadrato di lato 3.
«Figura» dichiara il metodo astratto «area()» senza corpo: rappresenta il concetto comune ma non può essere istanziata. Impone un contratto a tutte le sottoclassi.
«Cerchio» ridefinisce «area()» restituendo «pi raggio2»; «Quadrato» restituendo «lato*2». Stesso nome e firma del metodo base: è overriding, non overloading.
Data «figure = [Cerchio(2), Quadrato(3)]», il ciclo «for f in figure: print(f.area())» chiama su ogni elemento la versione corretta in base al tipo reale: il dispatch è dinamico.
Cerchio di raggio 2: area = pi 2^2 = 4pi ≈ 12.566. Quadrato di lato 3: area = 3^2 = 9.
Risultato: La stessa istruzione f.area() produce risultati diversi (≈ 12.566 per il cerchio di raggio 2, 9 per il quadrato di lato 3) secondo il tipo reale dell'oggetto: è il polimorfismo per overriding. Aggiungere una nuova figura non richiede di modificare il ciclo che le elabora.
Errori frequenti
Ripasso attivo
Definisci una classe astratta «Figura» con un metodo astratto «area()» e le sottoclassi «Cerchio» (attributo «raggio») e «Quadrato» (attributo «lato»), ciascuna con il proprio overriding di «area()». Scrivi poi un frammento che, scorrendo una lista di figure miste, ne stampa l'area, mostrando il polimorfismo all'opera. Calcola l'area per un cerchio di raggio 2 e un quadrato di lato 3.
Richiamo attivo
Ricorda i punti chiave — poi rivela.
Fonti: Indicazioni Nazionali per i Licei (DPR 89/2010, DM 211/2010) — Obiettivi Specifici di Apprendimento (Ministero dell'Istruzione e del Merito (MIM))
Diagramma delle classi UML (semplificato) di una biblioteca
Progetta il modello a oggetti di una biblioteca con le classi «Libro», «Utente» e «Prestito», definendone attributi e metodi e descrivendo le relazioni con le cardinalità.
Dal dominio emergono tre classi: «Libro» (titolo, isbn, copieDisponibili), «Utente» (nome, tessera) e «Prestito» (dataInizio, scadenza), che collega un utente a un libro.
Libro: «disponibile()». Utente: «prendi(libro)», «restituisci(prestito)». Prestito: «rinnova()», «inRitardo()». Ogni metodo è una responsabilità dell'oggetto cui appartiene.
Un Utente può avere molti Prestiti (1 a 0..); ogni Prestito riguarda esattamente un Libro (0.. a 1). Sono associazioni «ha-un», non ereditarietà: nessuna classe «è-un'altra».
Si disegnano tre rettangoli a tre scomparti (nome/attributi/metodi), con visibilità +/-, collegati da linee di associazione annotate con le cardinalità (vedi Fig. 5).
Risultato: Il modello distribuisce le responsabilità su tre classi coese collegate da associazioni «ha-un» con cardinalità esplicite: un progetto modulare ed estensibile (p. es. una futura classe «Bibliotecario» si aggiunge senza riscrivere le esistenti), correttamente documentato da un diagramma delle classi UML.
Errori frequenti
Ripasso attivo
Progetta il modello a oggetti di una piccola biblioteca. Individua almeno le classi «Libro», «Utente» e «Prestito», definendone attributi e metodi principali, e descrivi le relazioni tra esse (chi «ha» chi, con quali cardinalità). Rappresenta il risultato con un diagramma delle classi UML semplificato.
Richiamo attivo
Ricorda i punti chiave — poi rivela.
Fonti: Indicazioni Nazionali per i Licei (DPR 89/2010, DM 211/2010) — Obiettivi Specifici di Apprendimento (Ministero dell'Istruzione e del Merito (MIM)) · Esame di Stato del secondo ciclo — quadri di riferimento e griglie di valutazione (Ministero dell'Istruzione e del Merito (MIM))
Riferimenti e fonti