La classe astratta viene usata nel caso in cui hai dei metodi che devono essere ridefiniti, mentre altri sono sempre gli stessi. Un esempio potrebbe essere la classe per la connessione a diversi tipi di database. Si crea una classe di base astratta che contiene tutti i metodi per la connessione e l'esecuzione di query, eccetera, però si implementa comunque il metodo che visualizza un errore, che sarà uguale per tutti i database. Una classe astratta può comunque essere definita "una classe".
Un'interfaccia invece non è un'interfaccia, è come lo scheletro di una classe. Tutti i metodi di un'interfaccia devono essere necessariamente ridefiniti. Non è una classe, ma un costrutto a sé stante.