In einer Sprache wie C ++, die Mehrfachvererbung zulässt und keine Schnittstellen hat, können abstrakte Klassen, in denen alle Methoden abstrakt sind, als Schnittstellen dienen. Ich habe nicht so viel mit C ++ gearbeitet, aber ich denke, dass Mehrfachvererbung Probleme verursachen kann, wenn es Methoden mit demselben Namen in Basisklassen gibt.
In Sprachen wie PHP und C # bieten Schnittstellen ein Mittel, um einen ähnlichen Polymorphismus zu erzielen, obwohl ich es nicht gerne als "Vererbung" bezeichne, da es einen konzeptionellen Unterschied zwischen der Vererbung einer abstrakten Klasse und der Implementierung einer Schnittstelle gibt. Schnittstellen beseitigen das Konfliktproblem, da sie selbst keine Implementierung bieten.
Eine Schnittstelle dient als Vertrag für die Außenwelt, während eine abstrakte Klasse eine Implementierung bereitstellen kann. Wenn sie jedoch zum "Fälschen" einer Schnittstelle verwendet wird, wird dies höchstwahrscheinlich nicht der Fall sein.
Der hauptsächliche konzeptionelle Unterschied besteht darin, dass, wenn eine Klasse eine andere Klasse erbt (abstrakt oder nicht), eine Beziehung von "ist" besteht, also Car
ist a ein Vehicle
und Dog
ist ein Animal
. Bei einer Schnittstelle kommt es darauf an, was das Objekt tut. Also beide Car
und Dog
können Move()
und der Verbraucher weiß es, weil sie implementieren Movable
, aber ein Auto ist definitiv kein Dog
oder Animal
. Und die Bewegungsimplementierung wird anders sein (Räder gegen Beine), aber der konsumierende Code ist und sollte sich nicht darum kümmern. Bei Schnittstellen dreht sich alles um den konsumierenden Code und nicht um die Implementierung.
Der wichtigste Punkt ist, wenn Sie Schnittstellen in der Sprache Ihrer Wahl haben, verwenden Sie diese für Dinge, für die sie da sind. Wenn nicht (wie in C ++), können Sie sie mit reinen abstrakten Klassen fälschen.