El tipo interface proporciona un contrato sobre cómo interactuar con cualquier clase que implemente la interfaz. Una interfaz no puede ser instanciada, pero una clase puede heredar de la interfaz e implementar sus métodos. Una interfaz es similar a una clase abstract, excepto que no permite una implementación parcial o campos como parte de la definición.
Por ejemplo, vamos a crear una interfaz para cualquier cosa en la que te puedas montar, como una bicicleta o un caballo:
rideable := interface():
Mount()<decides> : void
Dismount()<decides> : voidCualquier clase que herede la interfaz debe implementar las funciones de la interfaz y añadir el especificador de anulación:
bicycle := class(rideable):
...
Mount<override>()<decides> : void =
...
Dismount<override>()<decides> : void =
...
horse := class(rideable):
...
Mount<override>()<decides> : void =
Una interfaz puede extender otra interfaz. Por ejemplo, puedes especificar que todo lo que se puede montar también debe poder moverse.
moveable := interface():
MoveForward() : void
rideable := interface(moveable):
Mount()<decides> : void
Dismount()<decides> : voidUna clase puede heredar de una interfaz y otra clase. Por ejemplo, puedes definir un caballo y diferenciarlo del que tiene una silla de montar:
horse := class(moveable):
...
MoveForward()<decides> : void =
...
saddle_horse := class(horse, rideable):
...
Mount<override>()<decides> : void =
...
Dismount<override>()<decides> : void =
Una clase puede heredar de varias interfaces.
lockable := interface():
Lock() : void =
...
Unlock() : void =
...
bicycle := class(rideable, lockable):
…
Mount<override>()<decides> : void =
...