Premessa: neanche una classe astratta è istanziabile (in realtà lo è, ma non direttamente).. :quipy: Tuttavia, i motivi per cui da entrambi i concetti non si possano istanziare oggetti .. sono molto, molto diversi.La differenza tra classi astratte e interfaccie e che le interfaccie nn contengono implementazioni e nn possono essere istanziate.
E infatti qui c'è da fare una bella e grossa rettifica.. che forse avrei dovuto fare a me stesso in un altro thread, che poi è rimasto sommerso.
Un'interfaccia e una classe astratta, sebbene simili a livello di definizioni sintattiche, non sono assolutamente la stessa cosa.
Fondamentalmente per il fatto che una classe (concreta o astratta che sia) è un modello sul quale istanziare degli oggetti, cioè delle entità che hanno vita propria; un'interfaccia è invece solo un insieme di funzioni, di operazioni (qualcuno potrebbe addirittura ardire "un'algebra"). Pertanto un'interfaccia non ha ragione di esistere se non esiste almeno una classe che la implementi (anche astratta).
Ora non so come il C# consideri le interfacce, ma questa è la visione di Java, e direi che è la più adeguata.
Partendo dalla prima osservazione si può inoltre sfatare una convinzione sbagliatissima, e cioè che "Java supporta una sorta di ereditarietà multipla tramite le interfacce". Nulla di più errato! Proprio perché un'interfaccia non è una classe, ed è più che ragionevole che una classe implementi più di un insieme di operazioni.
Lo scopo di un'interfaccia è quello di raggruppare sotto un certo punto di vista insiemi di oggetti anche assolutamente non correlati, ma che condividano le stesse operazioni. Questo per la genericità.
Basti pensare ad un algoritmo di ordinamento. Che senso avrebbe definirne di diversi per animali, numeri .. o qualunque altra cosa? L'algoritmo è lo stesso, è il concetto di ordine su quell'insieme che varia. Quindi quest'ultimo può essere condiviso sotto una stessa interfaccia, che ad es. potrebbe chiamarsi 'Confrontabile', e che andrebbe implementata (a livello di codice) con un operatore '<=' che definisca un ordine totale sull'insieme.
Questo è il vero significato di un'interfaccia.
Ciao.

