Tecnicamente, le differenze non sono davvero significative ma, concettualmente, sono cose completamente diverse e ciò porta alle differenze tecniche che altri hanno menzionato.
Una superclasse astratta è esattamente ciò che sembra, è un tipo comune condiviso da molti altri tipi, come Cats and Dogs are Animals.
Anche un'interfaccia è esattamente ciò che sembra, è un'interfaccia attraverso la quale altre classi possono comunicare con l'oggetto. Se vuoi fare una passeggiata con il gatto, stai bene, perché Cat implementa un'interfaccia CanWalk. Lo stesso per una lucertola, anche se camminano in modo molto diverso. Un serpente, d'altra parte, non implementa CanWalk, quindi non puoi dirlo a Walk. Nel frattempo, Lizard and Snake (o forse sottoclassi più esplicite - io non sono un esperto) potrebbero entrambi perdere la loro pelle, e quindi implementare CanShed, mentre un gatto non potrebbe farlo.
Ma sono tutti ancora animali e hanno alcune proprietà comuni, ad esempio se sono vivi o morti.
Questo è il motivo per cui tutti i metodi su un'interfaccia devono essere implementati come pubblici (o esplicitamente, in C #). Perché qual è il punto in un'interfaccia nascosta dalla classe che si interfaccia con l'oggetto? È anche il motivo per cui puoi avere più interfacce su un oggetto, anche quando una lingua non supporta l'ereditarietà multipla.
Per tornare alla tua domanda, quando la guardi in questo modo, raramente c'è una ragione per avere una superclasse completamente astratta.