Интерфейс — это тип, который обеспечивает соглашение о том, как взаимодействовать с любым классом, в котором реализован этот интерфейс. Для интерфейса нельзя создать экземпляр, но класс может наследоваться от интерфейса и реализовывать его методы. Интерфейс похож на абстрактный класс, за исключением того, что он не допускает частичную реализацию полей в рамках определения.
Например, создадим интерфейс для всего, на чём можно ездить, типа велосипеда или лошади:
rideable := interface():
Mount()<decides> : void
Dismount()<decides> : void
Классы, наследуемые от интерфейса, должны реализовать функции интерфейса с добавлением спецификатора override:
bicycle := class(rideable):
...
Mount<override>()<decides> : void =
...
Dismount<override>()<decides> : void =
...
horse := class(rideable):
...
Mount<override>()<decides> : void =
Интерфейс может выступать в качестве расширения для другого интерфейса. Например, вы можете указать, что все, на чем можно ездить, должно также уметь передвигаться.
moveable := interface():
MoveForward() : void
rideable := interface(moveable):
Mount()<decides> : void
Dismount()<decides> : void
Класс может наследоваться от интерфейса и от другого класса. Например, вы можете дать определение лошади и сделать её отличной от той, у которой есть седло, на котором можно ездить:
horse := class(moveable):
...
MoveForward()<decides> : void =
...
saddle_horse := class(horse, rideable):
...
Mount<override>()<decides> : void =
...
Dismount<override>()<decides> : void =
Класс может наследоваться от нескольких интерфейсов.
lockable := interface():
Lock() : void =
...
Unlock() : void =
...
bicycle := class(rideable, lockable):
…
Mount<override>()<decides> : void =
...