Utilizzare una classe astratta se si dispone di alcune funzionalità che si desidera è di avere sottoclassi. Ad esempio, se hai una serie di funzioni che vuoi che abbiano tutte le sottoclassi della classe astratta base.
Utilizzare un'interfaccia se si desidera un contratto generale su comportamento/funzionalità. Se hai una funzione o un oggetto che vuoi utilizzare in una serie di oggetti diversi, usa un'interfaccia. Quindi puoi cambiare l'oggetto che è passato, senza cambiare il metodo o l'oggetto che lo sta prendendo.
Le interfacce sono in genere lente rispetto alle classi astratte. Non si vorrebbe utilizzare le interfacce in una situazione in cui si scrive costantemente lo stesso codice per tutti i metodi dell'interfaccia. Usa una classe astratta e definisci ciascun metodo una volta.
Inoltre, se si sta tentando di creare una gerarchia di ereditarietà di oggetto specifica, non si vorrebbe provare a farlo solo con le interfacce.
Inoltre, in alcune lingue è possibile avere una sola classe base, e se un oggetto ha già una classe base, si dovrà eseguire un refactoring per utilizzare una classe base astratta. Ciò potrebbe significare che potresti voler utilizzare un inteface.
Come nota @tvanfosson, non è una cattiva idea utilizzare molte interfacce, quando si capiscono veramente le classi e le interfacce astratte, non è realmente una o/o situazione. Una situazione particolare potrebbe utilizzare sia classi astratte che interfacce o nessuno dei due. Mi piace usare le interfacce a volte semplicemente per limitare ciò che un metodo o un oggetto possono accedere su un oggetto parametro passato.
fonte
2009-02-17 18:34:35
dupe: http://stackoverflow.com/questions/56867/interface-vs-base-class – juan
è leggermente diverso perché si riferisce alle classi di base astratte, piuttosto che a tutte le classi di base. –
Vorrei rimuovere il collegamento duplicato, ma non ho quel livello di accesso –