Une interface propose un contrat sur la manière d'interagir avec toute classe qui implémente l'interface. Une interface ne peut pas être instanciée, mais une classe peut hériter de l'interface et implémenter ses méthodes. Une interface est similaire à une classe abstraite, hormis le fait qu'elle ne permet pas une implémentation partielle ou n'autorise pas les champs dans le cadre de la définition.
Par exemple, créons une interface pour tout ce que l'on peut chevaucher, comme un vélo ou un cheval :
rideable := interface():
Mount()<decides> : void
Dismount()<decides> : voidToutes les classes qui héritent de l'interface doivent implémenter les fonctions de l'interface et ajouter le spécificateur de remplacement :
bicycle := class(rideable):
...
Mount<override>()<decides> : void =
...
Dismount<override>()<decides> : void =
...
horse := class(rideable):
...
Mount<override>()<decides> : void =
Une interface peut prolonger une autre interface. Par exemple, vous pouvez préciser que tout ce qui peut être monté doit aussi pouvoir se déplacer.
moveable := interface():
MoveForward() : void
rideable := interface(moveable):
Mount()<decides> : void
Dismount()<decides> : voidUne classe peut hériter d'une interface et d'une autre classe. Par exemple, vous pouvez définir un cheval et le différencier de celui qui est sellé et sur lequel vous pouvez monter :
horse := class(moveable):
...
MoveForward()<decides> : void =
...
saddle_horse := class(horse, rideable):
...
Mount<override>()<decides> : void =
...
Dismount<override>()<decides> : void =
Une classe peut hériter de plusieurs interfaces.
lockable := interface():
Lock() : void =
...
Unlock() : void =
...
bicycle := class(rideable, lockable):
…
Mount<override>()<decides> : void =
...