Руководство разработчика

Интерфейсы

Интерфейс - это абстрактный тип, расширяющий возможности использования объектных типов. Для интерфейса определяется набор методов. Поля и события для интерфейсов не поддерживаются. Интерфейсы могут образовывать иерархию наследования. Интерфейсы могут включаться в список родительских типов при объявлении объектного типа. При этом в таком типе должны реализовываться все методы, объявленные в интерфейсах и их родителях. Реализуемые объектным типом интерфейсы могут иметь общие родительские интерфейсы, это не приводит к неоднозначности. Методы с одинаковыми именами в несвязанных интерфейсах должны иметь одинаковые параметры и результат, когда эти интерфейсы реализуются одним типом. Интерфейс может иметь более одного родительского интерфейса. Для объявления интерфейса используется ключевое слово ИНТЕРФЕЙС.

Синтаксис:

ИНТЕРФЕЙС <имя интерфейса> [ ( <род. интерфейс 1> [, <род. интерфейс 2> [, … ] ] ) ]
[
	ФУНКЦИЯ [<тип результата>: ] <имя метода 1> [ ( <параметры> ) ];
[ ФУНКЦИЯ [<тип результата>: ] <имя метода 2> [ ( <параметры> ) ]; ]
[ … ]
]

Имена интерфейсов являются именами типов. Поэтому допускается объявление переменных, передача параметров и возврат результата функций значений типа интерфейс. Значение типа интерфейс, может иметь специальное «пустое» состояние. Для задания пустого состояния используется ключевое слово НОЛЬ.

Синтаксис:

<имя интерфейса> = НОЛЬ

Для проверки значения типа интерфейс на пустоту его можно использовать в логических выражениях. Причем при действительном состоянии значения типа интерфейс оно трактуется как ДА, а при пустом – как НЕТ. При вызове методов интерфейса для пустого значения возникает ошибка времени выполнения, так как происходит обращение к интерфейсу по нулевой ссылке.

Для получения значением типа интерфейс действительного состояния, оно должно быть связано путем присваивания со значением объектного типа, реализующим данный интерфейс (прямо или косвенно). Время жизни переменной типа интерфейс и переменной реализующего типа может различаться. При удалении переменной объектного типа все связанные с ней переменные типа интерфейс автоматически принимают пустое состояние.

Пример:

ИНТЕРФЕЙС Инт 
[
  ФУНКЦИЯ ЧИСЛО: ПЛОЩАДЬ;
]

ТИП Фигура(Инт) 
[
  СТРОКА: название;
  ФУНКЦИЯ ЧИСЛО: ПЛОЩАДЬ 
    РЕЗУЛЬТАТ = 0 
  КОНЕЦ_ФУНКЦИИ
]

ТИП Точка(Фигура)
[
  ЧИСЛО: х, у;
  СТРОКА: название = "Точка";
]

КОНСТ Пи = 3.14159;

ТИП Окружность(Точка)
[
  ЧИСЛО: рад = 10; 
  СТРОКА: название = "Окружность";

  ФУНКЦИЯ ЧИСЛО: ПЛОЩАДЬ 
    РЕЗУЛЬТАТ = Пи * рад * рад 
  КОНЕЦ_ФУНКЦИИ
]

ТИП Прямоугольник(Точка)
[
  ЧИСЛО: шир = 10;
  ЧИСЛО: выс = 10;
  СТРОКА: название = "Прямоугольник";

  ФУНКЦИЯ ЧИСЛО: ПЛОЩАДЬ 
    РЕЗУЛЬТАТ = шир * выс
  КОНЕЦ_ФУНКЦИИ
]

ВЫЧИСЛИТЬ
  ПЕРЕМ *(Фигура): ф[ЧИСЛО(1, 5)];
  ф[1] = Прямоугольник[шир = 5]
  ф[2] = Окружность[х = 3, у = 3, рад = 3]
  ф[3] = Прямоугольник[]
  ф[4] = Окружность[]
  ф[5] = Точка[х = 5, у = 2]
  ПЕРЕМ Инт: инт1 = Фигура(ф[1]);
  
  ЦИКЛ ДЛЯ (и = 1, 5)
    СООБЩЕНИЕ(ф[и].название + " S = " + СТР(инт1.ПЛОЩАДЬ))
  КОНЕЦ_ЦИКЛА
КОНЕЦ

Интерфейсы можно определять в модулях и в исходных текстах. Значения типа интерфейс может использоваться везде, где и значение объектного типа. Значение типа интерфейс не может быть передано из одной виртуальной машины в другую, быть сохранено или передано по сети. Однако передача реализующего объектного значения решает эти задачи, т.к. значение интерфейса не содержит данных.


См. также: