Concetti di base di Java: polimorfismo

Concetti di base di Java: polimorfismo
In questo quinto post, sarà discusso il polimorfismo, uno dei più importanti
concetti di base di Java.
Il polimorfismo è uno dei concetti la cui definizione è di facile
comprensione, ma per capire completamente il concetto e sopratutto per
applicarlo correttamente, è necessario del tempo.
Ecco una definizione tratta da Wikipedia:
In informatica, il termine polimorfismo (dal greco πολυμορφοσ composto dai
termini πολυ molto e μορφή forma quindi “avere molte forme”) viene usato in
senso generico per riferirsi a espressioni che possono rappresentare valori
di diversi tipi (dette espressioni polimorfiche). In un linguaggio non
tipizzato, tutte le espressioni sono intrinsecamente polimorfiche.
Vantaggi
Il polimorfismo per inclusione permette al programma di fare uso di oggetti
che espongono una stessa interfaccia, ma implementazioni diverse. Infatti,
l’interfaccia del tipo base definisce un contratto generale che sottoclassi
diverse possono soddisfare in modi diversi – ma tutti conformi alla specifica
comune stabilita dal tipo base. Di conseguenza, la parte del programma che
fruisce di questa interfaccia – chiamata in gergo client – tratta in modo
omogeneo tutti gli oggetti che forniscono un dato insieme di servizi, a
prescindere dalle loro implementazioni interne (presumibilmente diverse tra
loro) definite dalle rispettive classi. In virtù di questa possibilità, si
può utilizzare lo stesso codice personalizzandone o modificandone anche
radicalmente il comportamento, senza doverlo riscrivere, ma semplicemente
fornendogli in inputuna differente implementazione del tipo base o dei tipi
base.
Se usato bene, il polimorfismo permette di avere una struttura ad oggetti
estensibile, in quanto si può indurre il client ad invocare nuovi metodi
personalizzati includendoli in una classe apposita;
resistente, perché eventuali esigenze future nel programma o nella
scrittura del codice potranno essere implementate fornendo ad
un client già scritto una nuova classe scritta ad hoc.
Da queste righe di introduzione del concetto di polimorfismo è intuibile
quanto detto in precedenza, riguardo alla difficoltà di comprendere
correttamente il suo utilizzo. Si può dire che questo aspetto di Java,
permette di rendere più robusto il codice e sopratutto sarà più semplice
aggiungere funzionalità aggiuntive.
Vediamo un primo esempio:
Fattoria
package utils;
public interface Animale {
public void emetteVerso();
}
Con questa struttura di codice è possibile aggiungere qualsiasi tipo di
animale, basterà che implementi la sua interfaccia e quindi dovrà emettere un
verso !
Disegnabile
package utils;
import java.awt.Graphics;
public interface Disegnabile {
public void disegna(Graphics graphics);
}
/**
* Questa classe ha la responsabilità di disegnare tutti gli elementi
* in un pannello
* @author Giacomo
*/
package utils;
import java.awt.Graphics;
import java.util.ArrayList;
import javax.swing.JPanel;
public class Pannello extends JPanel {
private static final long serialVersionUID = 1L;
private ArrayList<Disegnabile> disegnabili = new ArrayList<>();
public void aggiungiDisegnabile(Disegnabile disegnabile){
disegnabili.add(disegnabile);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
for (int i = 0; i < disegnabili.size(); i++) {
disegnabili.get(i).disegna(g);
}
}
}
Attraverso l’interfaccia disegnabile, sarà possibile aggiungere al pannello
qualsiasi figura geometria, come ad esempio un rombo, quadrato etc…
Conclusione
Far dipendere i componenti del proprio progetto da Interfaccia, permette di
dare robustezza al nostro software e lo rende facilmente gestibile sia per
nuove implementazioni, sia per refactoring.
I codici presenti in questo post, come del resto tutti quelli delle lezioni
precedenti, sono scaricabili dalla repo di Github, all’indirizzo
https://github.com/jackbell16/JavaCode