Typ interfejsu określa zasady interakcji z dowolną klasą implementującą interfejs. Nie można tworzyć instancji interfejsu, jednak klasa może dziedziczyć z interfejsu i implementować jego metody. Interfejs działa podobnie jak klasa abstrakcyjna z tą różnicą, że nie dopuszcza częściowej implementacji ani pól jako części definicji.
Utwórzmy na przykład interfejs dla dowolnego obiektu, na którym można jeździć, takiego jak rower lub koń:
rideable := interface():
Mount()<decides> : void
Dismount()<decides> : voidWszelkie klasy, które dziedziczą interfejs, muszą implementować funkcje interfejsu i dodawać specyfikator zastąpienia:
bicycle := class(rideable):
...
Mount<override>()<decides> : void =
...
Dismount<override>()<decides> : void =
...
horse := class(rideable):
...
Mount<override>()<decides> : void =
Interfejs może stanowić rozszerzenie innego interfejsu. Można na przykład określić, aby każdy obiekt, na którym można jeździć, mógł się również poruszać.
moveable := interface():
MoveForward() : void
rideable := interface(moveable):
Mount()<decides> : void
Dismount()<decides> : voidKlasa może dziedziczyć z interfejsu oraz innej klasy. Można na przykład zdefiniować konia, a następnie odróżnić go od wierzchowca z siodłem, na którym można jeździć:
horse := class(moveable):
...
MoveForward()<decides> : void =
...
saddle_horse := class(horse, rideable):
...
Mount<override>()<decides> : void =
...
Dismount<override>()<decides> : void =
Jedna klasa może dziedziczyć z wielu interfejsów.
lockable := interface():
Lock() : void =
...
Unlock() : void =
...
bicycle := class(rideable, lockable):
…
Mount<override>()<decides> : void =
...