16.5 Schnittstellen
ActionScript 2.0\Schnittstellen
Zu den Stärken der Objektorientierung zählt, dass Objekte feste Schnittstellen verwenden, über die sie miteinander kommunizieren. Das macht es bei komplexen Projekten einfacher, Objekte unterschiedlichen Typs zu nutzen, solange die Schnittstellen identisch sind. In einem Shop sollte es für die Ermittlung des Preises beispielsweise unerheblich sein, ob es sich um eine Hose oder eine Jacke handelt:
gesamtPreis = jeans.ermittlePreis()+sacko.ermittlePreis();
Schnittstellen (engl. Interfaces) helfen dabei, solche Strukturen festzulegen, indem sie Methoden und deren Parameter vorschreiben. Die Beschreibung einer Methode inklusive der Typen für die Parameter und die Rückgabe bezeichnet man dabei als Signatur. Ein Interface ist somit nichts anderes als eine Sammlung von Signaturen.
Schnittstellen stellen die Verwendbarkeit von Objekten in einem speziellen Kontext sicher, da die in der Schnittstelle definierten Signaturen implementiert sein müssen! Ein angenehmer Nebeneffekt von Schnittstellen ist, dass so Funktionalität auch in Gruppen zusammengefasst werden kann. Sämtliche Methoden, die von den Produkten in einem Shop beherrscht werden müssen, könnten z.B. in der Schnittstelle »Verkaufbar« deklariert sein.
Polymorphie
Falls Objekte aufgrund gleicher Signaturen in einem Programm gegeneinander ausgetauscht werden können, dann spricht man von Polymorphie. Die Gleichartigkeit von Methoden kann durch Schnittstellen sichergestellt werden.
16.5.1 Interfaces erstellen
Die Benennung und Speicherung von Interfaces sowie die Organisation in Packages verhält sich genauso wie bei Klassen.
Eine Schnittstelle erstellen Sie wie eine Klasse, nur dass eine Schnittstelle nichts weiter als die Deklaration enthält. Die eigentliche Programmierung der Funktionalität geschieht in den Klassen, die die Schnittstelle dann verwenden.
interface interfaceName {
// Deklaration von Methoden
}
Innerhalb einer Schnittstelle dürfen nur Methoden und keine Eigenschaften deklariert werden (siehe »Öffentlich und privat«, Seite 412). Private oder statische Methoden sind ebenfalls nicht erlaubt. Das Schlüsselwort public für Methoden ist dabei wie auch schon bei den Klassen optional:
interface Einkaufen {
function sucheAus();
public function kaufe();
}
Signatur
Natürlich darf hier bereits typisiert werden, um die Umsetzung und den Aufruf der Methoden typsicher zu gestalteten. Hier spricht man dann auch von der Signatur einer Methode:
interface Einkaufen {
function sucheAus(obj:Object):Void;
function kaufe(anzahl:Number):Void;
}
Eine Schnittstelle speichern Sie als ActionScript-Datei unter dem Namen der Schnittstelle ab. Wie bei Klassen muss der Name der Schnittstelle mit dem Namen der Datei identisch sein. Außerdem sind auch hier wieder Packages erlaubt (siehe »Packages« ab Seite 403))!
16.5.2 Implements
Die eigentliche Programmierung der Methoden aus einer Schnittstelle geschieht in den Klassen, die die Schnittstelle verwenden.
class Frau implements Einkaufen {
var ausgesuchtesObjekt:Object;
function sucheAus(obj:Object):Void {
ausgesuchtesObjekt = obj;
}
function kaufe(anzahl:Number):Void {
trace("Ich kaufe "+String(anzahl)+" "+String(ausgesuchtes
Objekt));
}
}
Sollten bei der Verwendung einer Schnittstelle abweichende Signaturen programmiert oder die Umsetzung einer Methode sogar ganz vergessen werden, dann meldet Flash dies als Fehler. Die Klasse mit der Schnittstelle kommt im Folgenden wie jede andere Klasse zum Einsatz:
frau = new Frau();
frau.sucheAus("Äpfel");
frau.kaufe(5);
// Ausgabe ist "Ich kaufe 5 Äpfel"
Klassen dürfen auch mehrere Schnittstellen gleichzeitig verwenden – Hauptsache, Sie vergessen nicht, sämtliche zugehörigen Methoden zu implementieren:
class Frau implements Einkaufen, Tanzen, Kochen, Singen {
...
}
Vererben von Schnittstellen
Schnittstellen dürfen von anderen Schnittstellen erben und somit eine vorhandene Schnittstelle erweitern. Beispielsweise haben Sie eine Schnittstelle »Einkaufen« und möchten nur eine Schnittstelle »Verkaufen« umsetzen, die auch das »Einkaufen« umfasst. Dann reicht es aus, dass die Schnittstelle »Verkaufen« von der Schnittstelle »Einkaufen« erbt:
interface Verkaufen extends Einkaufen {
function verkaufe (anzahl:Number):Void;
}
Eine Klasse, die diese Schnittstelle implementiert, muss dann aber neben den Methoden vom »Verkaufen« auch die Methoden vom »Einkaufen« umsetzen.
|