Hm, mit so Aussagen wie "Interfaces haben keine Variablen, nur Methoden" wär ich vorsichtig, solche Sachen sind ziemlich abhängig von der Programmiersprache
Gerade in Java kann man z.B. static final-Variablen in Interfaces definieren - wobei man wieder argumentieren könnte, dass das im Grunde Konstanten sind.
... stellt sich mir die Frage , wann es sich besser anbietet, eine abstrakte Methode bzw. ein Interface zu verwenden.
In den 2 Posts weiter oben stand eigentlich schon alles grundlegende gut erklärt. Etwas tiefergehend ist halt die Bedeutung von Interfaces:
Interfaces haben ja im Grunde "nur" den Sinn, dass sich eine Klasse - platt gesagt - auf das Interface casten lässt, und man dann die Methoden aufrufen kann. Ein Objekt einer Klasse, die z.B. das Interface "List" implementiert, kann man also auf "List" casten.
In größeren Projekten wirst Du feststellen, dass Methoden als Parameter tendenziell Interfaces wollen oder Interfaces zurückgeben. Das hat den Hintergrund, dass man mit Interfaces viel freier hantieren kann, da ja, wie gesagt, eine Klasse beliebig viele Interfaces haben kann, aber nur eine Oberklasse. Desweiteren will eine Methode auf ihre Parameter eigentlich nur irgendwelche Befehle aufrufen, und die werden über das Interface bekannt gemacht.
Ein Beispiel hierzu ist das Collection-Framework in Java: es ist guter Stil, wenn eine Methode, die z.B. eine Auflistung an Strings benötigt, eine Deklaration etwa der folgenden Art hat:
Code:
void myFunction(List<String> someStrings) {...
oder
Code:
void myFunction(Collection<String> someStrings) {...
und nicht etwa:
Code:
void myFunction(AbstractList<String> someStrings) {...
oder
Code:
void myFunction(ArrayList<String> someStrings) {...
List ist ein Interface, und für "myFunction" sollte es auch nur wichtig sein, dass der Parameter eine Liste ist. Wie genau die Liste implementiert ist (also ob es eine ArrayList, LinkedList, etc. ist), ist für den Datenaustausch zwischen Klassen und Methoden in der Regel unwichtig.
Interfaces sind auch wichtig für die Gliederung von Komponenten: Wenn Du eine Programmkomponente, beispielsweise ein Java-Package, entwickelt hast, und diese an andere weitergibst, wirst Du in diesem Sinne auch eher nur Interfaces nach außen bekannt geben, und keine (abstrakten) Klassen, da diese Code beinhalten. D.h. öffentliche Methoden aus deinem Softwarepaket sollten Interfaces zurückgeben, oder Interfaces als Parameter benötigen.
Über die folgende Aussage lässt sich nun wiederum streiten, aber ich würde sagen, wann immer es geht, Interfaces benutzen. Klassenhierarchien baut man auf, um Codeduplizierung zu vermeiden. Wenn es sich anbietet, kann man ohne Sorgen natürlich beides machen (also Interfaces und abstrakte Klassen kombinieren), wie es z.B. im Java Collection-Framework zuhauf gemacht wird.