Il tipo interfaccia fornisce un contratto per interagire con qualsiasi classe che implementa l'interfaccia. Non è possibile creare un'istanza dall'interfaccia, ma una classe può ereditare dall'interfaccia e implementarne i metodi. Un'interfaccia è simile a una classe astratta, tranne per il fatto che non consente implementazioni parziali o campi nell'ambito della definizione.
Ad esempio, creiamo un'interfaccia per qualsiasi elemento su cui si possa montare, come una bicicletta o un cavallo:
rideable := interface():
Mount()<decides> : void
Dismount()<decides> : void
Le classi che ereditano l'interfaccia devono implementare le funzioni dell'interfaccia e aggiungere lo specificatore di override:
bicycle := class(rideable):
...
Mount<override>()<decides> : void =
...
Dismount<override>()<decides> : void =
...
horse := class(rideable):
...
Mount<override>()<decides> : void =
...
Dismount<override>()<decides> : void =
...
Un'interfaccia può estenderne un'altra. Ad esempio, puoi specificare che tutto ciò che si può cavalcare deve essere in grado di muoversi.
moveable := interface():
MoveForward() : void
rideable := interface(moveable):
Mount()<decides> : void
Dismount()<decides> : void
Una classe può ereditare da un'interfaccia e da un'altra classe. Ad esempio, puoi definire un cavallo e distinguerlo da uno che ha una sella su cui si può montare:
horse := class(moveable):
...
MoveForward()<decides> : void =
...
saddle_horse := class(horse, rideable):
...
Mount<override>()<decides> : void =
...
Dismount<override>()<decides> : void =
...
Una classe può ereditare da più interfacce.
lockable := interface():
Lock() : void =
...
Unlock() : void =
...
bicycle := class(rideable, lockable):
…
Mount<override>()<decides> : void =
...
Dismount<override>()<decides> : void =
...
Lock<override>() : void =
...
Unlock<override>() : void =
...
MoveForward<override>() : void =
...