back to top

Diagramma delle classi: ereditarietà ed interfacce – Guida UML

Fino a questo momento abbiamo parlato di classi, associazioni con le relative molteplicità, aggregazioni e composizioni. Solo con la conoscenza di questi strumenti è possibile realizzare diagrammi delle classi per progetti abbastanza articolati, ma per poter progettare software complessi è necessario introdurre alcuni concetti di programmazione ad oggetti come la derivazione e le interfacce .

Derivazione

Richiamiamo adesso il concetto di derivazione. Quando si deriva una classe da un’altra, la classe derivata eredita tutti gli attributi e tutti i metodi definiti pubblici o protetti appartenenti alla classe padre. La derivazione è spesso utilizzata per specializzare una classe che possiede attributi più generali. In UML il concetto di ereditarietà si rappresenta con una linea con un freccia ad una estremità che punta in direzione della classe padre. Mostraiamo adesso un diagramma delle classe che verrà spiegata in seguito:

Esempio di rappresentazione di una derivazione in UML

Quando verrà istanziato un oggetto Autobus automaticamente verrà richiamato il costruttore della classe Veicolo che inizializzerà i due attributi della classe. Se poi si vuole conoscere il proprietario dell’Autobus, non sarà possibile accedere direttamente all’attributo, in quanto definito privato, ma si potrà utilizzare il metodo getProprietario() (definito pubblico) che restituirà il valore dell’attributo proprietario. Per quanto riguarda il concetto di specializzazione è evidente anche in questo piccolo esempio dato che la classe Autobus è più ricca di informazioni rispetto alla classe padre Veicolo e quindi risulta più specifica.

Quando si progettano software di grandi dimensioni l’ereditarietà è uno degli strumenti che la programmazione ad oggetti offre più utilizzata.

Interfacce

Le interfacce sono una sorta di contenitore di operazioni comuni a più classi e lo scopo principale delle interfacce è appunto offrire queste funzioni ad altre classi che le possono implementare. Ciò che realmente differenzia una interfaccia da una classe è che la prima si limita a dare una definizione dei metodi (il prototipo) senza nessuna implementazione e non può dichiarare attributi ma solo ed esclusivamente costanti. In UML un’interfaccia viene identificata con lo stesso simbolo della classe, ma prima del nome, viene anteposta la parola chiave interface. Per come è stata definita un interfaccia è ovvio che non si può direttamente istanziare, ma viene implementata da un’altra classe che poi può essere istanziata. L’associazione tra la classe che implementa l’interfaccia e l’interfaccia stessa è detta realizzazione ed, in UML, viene rappresentata con una linea tratteggiata con una freccia sull’estremità che punta verso l’interfaccia. Nell’esempio seguente viene modellato il modo in cui in Java è possibile creare un thread; viene definita l’interfaccia Runnable che presenta il metodo run() e una classe che la realizza detta Thread.

Esempio di rappresentazione di una interfaccia in UML

Solitamente si utilizza un’interfaccia quando le funzionalità che mette a disposizione non potrebbero essere inserite in una classe padre. Per spiegare questo concetto facciamo un breve esempio: immaginiamo un metodo mangia() che è comune sia ad un essere umano che ad un serpente. Per esempio non sarebbe possibile inserire il metodo mangia() in una classe animale e poi fare una derivazione in quanto l’essere umano non è un animale. Per questo motivo è possibile definire un’interfaccia che ha il metodo mangia() e poi effettuare due realizzazione una per l’essere umano e una per il serpente. Il vantaggio dell’uso dell’interfaccia è dunque quello di non introdurre dipendenze tra classi che non ne hanno, ma comunque effettuare una sorta di collegamento logico. Altro vantaggio che l’interfacce offrono è quello di suddividere il problema in sotto-problemi dove ogni sotto-problema non è minimamente a conoscenza di come è strutturato un altro e la comunicazione avviene appunto tramite le interfacce. Un sistema progettato in questo modo ha il vantaggio di essere facilmente estendibile in quanto è possibile aggiungere nuovi moduli e collegarli agli altri tramite le interfacce evitando di collegare, in maniera diretta, i vari moduli.

PubblicitÃ