OK, nachdem ich es gerade selbst "begriffen" habe - hier ist es in Laiensprache (bitte korrigieren Sie mich, wenn ich falsch liege) - ich weiß, dass dieses Thema gaaanz alt ist, aber vielleicht stolpert jemand anderes eines Tages darüber...
Mit abstrakten Klassen können Sie einen Entwurf erstellen und zusätzlich Eigenschaften und Methoden KONSTRUIEREN (implementieren), die ALLE ihre Nachkommen besitzen sollen.
Bei einer Schnittstelle hingegen können Sie nur angeben, dass Eigenschaften und/oder Methoden mit einem bestimmten Namen in allen Klassen vorhanden sein sollen, die sie implementieren - aber nicht, wie Sie sie implementieren sollen. Außerdem kann eine Klasse VIELE Schnittstellen implementieren, aber nur EINE abstrakte Klasse erweitern. Eine Schnittstelle ist eher ein hochrangiges architektonisches Werkzeug (was klarer wird, wenn man anfängt, Entwurfsmuster zu verstehen) - eine abstrakte Klasse hat einen Fuß in beiden Lagern und kann auch einen Teil der schmutzigen Arbeit erledigen.
Warum sollte man das eine dem anderen vorziehen? Ersteres ermöglicht eine bessere Beton Definition der Nachkommenschaft - letztere ermöglicht eine größere Polymorphismus . Dieser letzte Punkt ist für den Endnutzer/Codierer wichtig, der diese Informationen zur Implementierung des A.P. nutzen kann. I(nterface) in einer Vielzahl von Kombinationen/Formen, um ihren Bedürfnissen gerecht zu werden.
Ich glaube, das war für mich der entscheidende Moment - Schnittstellen weniger aus der Sicht des Autors zu betrachten, sondern mehr aus der Sicht eines späteren Programmierers, der ein Projekt implementiert, oder Erweiterung eine API.