Anonimamente22 ha scritto:
La cosa che mi sfugge è il vantaggio.
Cioè, se devo rifare un determinato metodo, a che pro estendere un interfaccia dovendo comunque riscriverlo?
Non mi è molto chiara la domanda. Qualsiasi metodo che si voglia invocare deve necessariamente essere implementato, ma questo non comporta alcuna relazione su quelli che sono i vantaggi dell'interfaccia.
Il vantaggio dell'interfaccia sta nel poterla usare come tipo di dato per tutti quei campi e/o parametri dove è richiesto un oggetto che svolga una determinata funzione. L'interfaccia esprime le funzioni che si vogliono sfruttare.
La classe rappresenta la sua implementazione nel dettaglio. Utilizzare la classe come tipo di dato significa legarsi mani e piedi a una specifica implementazione, e ciò è sbagliato.
Metaforicamente parlando, usare la classe - quindi senza una interfaccia - è come se il progettista di un impianto elettrico avesse collegato la lampada direttamente al cablaggio dell'impianto, fondendo le due cose assieme e intrecciando i fili: se vuoi intervenire sull'uno o sull'altra, devi necessariamente operare sul collegamento e modificare entrambi gli oggetti.
La presenza dell'interfaccia, sempre metaforicamente, si realizza con la presenza della spina: la lampada e l'impianto elettrico condividono uno standard, l'interfaccia, e finché entrambi lo rispettano, i due elementi possono essere collegati, ma ciò consente di intervenire sull'impianto senza dover modificare la lampada e/o rimuovere la lampada e collegare un televisore all'impianto, senza dover cambiare quest'ultimo.
Il vantaggio dell'interfaccia non è per una scorciatoia che offre, bensì nel design e nella flessibilità che consente di ottenere, potenzialmente permettendo a un oggetto di godere di una implementazione esterna che potrebbe essere stravolta, simulata o completamente sostituita, senza dover apportare modifiche al codice che fa uso di questa implementazione.
In realtà, grazie alla furbizia della maggior parte degli IDE come IntelliJ o NetBeans, l'interfaccia ha anche il vantaggio di fornire una guida alla scrittura della classe: quando dichiari di implementare una interfaccia nello scheletro di una classe vuota, l'IDE ti consente di generare automaticamente il corpo dei metodi dell'interfaccia con la loro firma precisa andando a inserire il corpo dell'implementazione (se la classe non è astratta). Allo stesso modo, il compilatore verifica che tutti i metodi siano implementati, altrimenti non è possibile fare il build.
Ciao!