Hi,
also darüber kann man sich sicherlich sehr ausführlich auslassen, ich mach's mal relativ kurz. Du musst zunächst mal den Unterschied zwischen Interfaces und abstrakten Klassen wahren.
Ein Interface beschreibt - ohne jegliche Implementierung - wie eine Klasse _mindestens_ auszusehen hat. Sämtliche "Unterklassen" müssen sich daran halten, müssen also alle Methoden in einer für sie angemessenen Methode implementieren.
Eine abstrakte Klasse enthält idR. bereits einige implementierte Methoden, die nämlich für alle Unterklassen gleich ablaufen werden (siehe Beispiel unten), verhält sich ansonsten wie ein Interface.
Der Vorteil der ganzen Sache ist der: Wenn du eine Variable deklarierst und sagst "du bist vom Typ meinInterface", dann kannst du auf diese Variable sämtliche Objekte legen, die dieses Interface erfüllen. Ein klassisches Beispiel wäre z.B.:
abstr. Klasse Person { getName(), getVorname(), getGeburtstag() }
Klasse Mitarbeiter:Person { getPersonalNummer(), getGehalt() }
Klasse Kunde:Person { getKundennummer(), getUmsatz() }
Du schreibst 1x die Methoden von Person, nämlich in der abstrakten Klasse und für Mitarbeiter sowie Kunde schreibst du nun nur noch die speziellen Methoden. Wenn du nun eine Anzeige aller dir bekannten Personen machen willst, so definierst du dir eine Variable vom Typ Person. Du kannst sowohl Kunden als auch Mitarbeiter darauf ablegen, deine Anwendung hat in jedem Fall die Gewissheit, dass sie Namen, Vornamen und Geburtstag ermitteln kann, egal was das Objekt sonst noch kann.
Auf diese Art kannst du auch Plugin-basierte Systeme aufbauen: Du gibst vor, was diese Klasse nach außen ausmachen soll, jede Klasse die von sich behauptet das zu können kannst du definitiv auch so ansteuern.
Beispiel aus unserer Anwendung:
Für sämtliche zentrale Konzepte innerhalb der Anwendung sind Interfaces vorgegeben. Die Teile der Anwendung definieren ihre Variablen immer nur auf Basis dieser Interfaces und nutzen auch nur die Methoden des Interfaces.
Dann gibt es die Implementierungsebene, in der die ganzen Interfaces mit Leben gefüllt werden.
Wenn das System startet liest es eine Konfiguration aus und beschließt dann, welche Implementierung aktuell gültig ist und verwendet werden soll. Du kannst also die Implementierung austauschen, ohne an anderen Stellen an den Code ranzumüssen, weil die Klassen die damit arbeiten gar nichts von der Implementierung wissen sondern nur das Interface kennen. Unsere aktuelle Anwendung nutzt das z.B. für Implementierung mit Java1.4 und Implementierung mit neueren Java-Versionen. An anderer Stelle scheren wir verschiedene Event-Logger über einen Kamm, egal ob die für Bildschirm oder Datei geschrieben sind, wir wissen man kann .log(x, y, z) aufrufen.
MfG
Rouven
-------------------
ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(