Originariamente inviato da lolide
Allora, il ragionamento è semplice: interfacce, classi astratte e classi concrete (le normali classi) considerali tipi.
Ogni metodo restituisce una variabile di tipo Tipo e può avere dei parametri di tipo Tipo.
Il vincolo che hai è che puoi creare oggetti solo da classi concrete, quindi se vuoi creare un oggetto di una classe astratta o un'interfaccia (classe con tutti i metodi astratti), devi definirne i metodi statici.
Prendi ad esempio le collection Java: c'è un'interfaccia generale Collection che rappresenta un insieme di oggetti, con un metodo per aggiungerli, uno per rimuoverli, e un metodo iterator per scorrerne il contenuto. Poi ci sono diverse specializzazioni: c'è l'interfaccia List che rappresenta una
lista di oggetti, oppure Map che è una lista di oggetti Entry che associano una chiave ad un valore, oppure ancora Set che rappresenta un insieme di elementi senza duplicati.
Poi ci sono le classi concrete per esempio dell'interfaccia List, ArrayList che è una lista fatta da un array, quindi la migliore per la ricerca casuale (attraverso indice), oppure LinkedList che è piu' veloce nell'inserimento di molti oggetti ma piu' lenta nella ricerca casuale ecc...
Se volessi effettuare un metodo per stampare a video il contenuto di una collection, con una libreria strutturata in questo modo, ti conviene comporre un metodo così?
codice:
public void printCollection (ArrayList<String> a) {
int i = 0;
for (String s : a) {
System.out.println("Elemento " + i + ": " + s);
i++;
}
}
Se il programmatore volesse stampare i valori di una mappa? quel metodo non funzionerebbe e dovresti riscriverlo. Se invece viene scritto così:
codice:
public void printCollection (Collection<String> a) {
int i = 0;
for (String s : a) {
System.out.println("Elemento " + i + ": " + s);
i++;
}
}
Tu puoi usare quel metodo con qualunque struttura che estende Collection, quindi con i Set, List e Map.