Differenze tra classi astratte e interfacce
Entrambe permettono di definire un concetto senza dover conoscere i dettagli di una classe, dettagli che saranno implementati dai figli.
Differenze sintattiche principali:
- Una classe astratta, oltre a metodi astratti, può contenere dati e metodi non astratti. Una interfaccia no.
- Una classe astratta può avere un costruttore. Una interfaccia no.
- In una interfaccia si possono definire solo costanti.
- In una interfaccia i metodi la visibità sarà public in automatico (c’è anche la possibilità di usare quella di default ma i figli saranno “costretti” a fare l’override dei metodi con public, anche se sono nello stesso package).
Oltre le differenze sintattiche, si usa una classe astratta o una interfaccia in base al tipo di legame che si vuole instaurare con le classi derivate. Se si vuole un legame molto forte con le classi derivate si usa una classe astratta, in questo modo tutti i figli avranno un comportamento comune (ricordiamoci che una classe può estendere solo una classe). Le interfacce, invece, servono per definire un comportamento più generico con i figli, potendo questi essere di vario genere e natura (ciò è dovuto al fatto che un figlio può implementare tante interfacce ma solo una classe, astratta o meno).