Tecnicamente, le differenze non sono davvero significative ma, concettualmente, sono cose completamente diverse e questo porta alle differenze tecniche che altri hanno menzionato.
Una superclasse astratta è esattamente ciò che sembra, è un tipo comune che è condiviso da molti altri tipi, come Cats and Dogs are Animals.
Un'interfaccia è anche esattamente come sembra, è un'interfaccia attraverso la quale altre classi possono comunicare con l'oggetto. Se vuoi fare una passeggiata Cat, stai bene, perché Cat implementa un'interfaccia CanWalk. Lo stesso vale per una lucertola, sebbene camminino in modo molto diverso. Un Snake, d'altra parte, non implementa CanWalk, quindi non puoi dirlo a Walk. Nel frattempo, Lizard e Snake (o forse sottoclassi più esplicite - non sono un esperto) potrebbero entrambi perdere la pelle e quindi implementare CanShed, mentre un gatto non può farlo.
Ma sono tutti ancora animali e hanno alcune proprietà comuni, come se siano 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 è possibile avere più interfacce per un oggetto, anche quando una lingua non supporta l'ereditarietà multipla.
Per tornare alla tua domanda, quando la guardi in questo modo, molto raramente c'è un motivo per avere una superclasse completamente astratta.