La differenza sostanziale tra una classe astratta e un'interfaccia è che la prima definisce l'essenza di un oggetto (che cosa è), mentre la seconda ne indica il comportamento (che cosa fa). Inoltre una classe astratta è in grado di definire membri che verranno acquisiti dalla classe derivata, e quindi dichiara delle funzionalità di base ereditabili da tutti i discendenti; l'interfaccia, al contrario, "ordina" a chi la implementa di definire un certo membro con una certa funzione, ma non fornisce alcun codice di base, né alcuna direttiva su come un dato compito debba essere svolto. Ecco che, sulla base di queste osservazioni, possiamo individuare alcune casistiche in cui sia meglio l'una o l'altra:
Quando esistono comportamenti comuni : interfacce
Quando esistono classi non riconducibili ad alcun archetipo o classe base: interfacce
Quando tutte le classi hanno fondamentalmente la stessa essenza : classe astratta
Quando tutte le classi, assimilabili ad un unico archetipo, hanno bisogno di implementare la stessa funzionalità o gli stessi membri : classe astratta |