Der Typ Interface bietet einen Kontrakt für die Interaktion mit jeder Klasse, die das Interface implementiert. Ein Interface kann nicht instantiiert werden, aber eine Klasse kann von dem Interface übernehmen und seine Methoden implementieren. Ein Interface ist ähnlich wie eine abstrakte Klasse, außer dass sie keine teilweise Implementierung oder Felder als Teil der Definition zulässt.
Lass uns zum Beispiel ein Interface für etwas erstellen, auf dem du dich wie auf einem Fahrrad oder einem Pferd fortbewegen kannst:
rideable := interface():
Mount()<decides> : void
Dismount()<decides> : voidJede Klasse, die das Interface erbt, muss die Funktionen des Interfaces implementieren und den Override-Spezifizierer hinzufügen:
bicycle := class(rideable):
...
Mount<override>()<decides> : void =
...
Dismount<override>()<decides> : void =
...
horse := class(rideable):
...
Mount<override>()<decides> : void =
Ein Interface kann ein anderes Interface erweitern. Zum Beispiel kannst du festlegen, dass alles, was du reiten kannst, auch in der Lage sein sollte, sich zu bewegen.
moveable := interface():
MoveForward() : void
rideable := interface(moveable):
Mount()<decides> : void
Dismount()<decides> : voidEine Klasse kann von einem Interface und einer anderen Klasse erben. Zum Beispiel kannst du ein Pferd definieren und es von einem Pferd unterscheiden, das einen Sattel hat, auf dem du reiten kannst:
horse := class(moveable):
...
MoveForward()<decides> : void =
...
saddle_horse := class(horse, rideable):
...
Mount<override>()<decides> : void =
...
Dismount<override>()<decides> : void =
Eine Klasse kann von mehreren Interfaces erben.
lockable := interface():
Lock() : void =
...
Unlock() : void =
...
bicycle := class(rideable, lockable):
…
Mount<override>()<decides> : void =
...