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

Объектные типы и интерфейсы

Объектные типы тесно связаны с другой разновидностью типов – интерфейсами при помощи принципа наследования. Связка объектный тип - интерфейс реализует один из принципов ООП - полиморфизм. То есть метод указанный в интерфейсе может использоваться для разных объектных типов. В отличие от методов родительского типа, у методов интерфейсов нет определения (т.е. абстрактные методы), поэтому объектный тип обязан предоставить их определения. Методы объектного типа могут давать реализацию абстрактных методов интерфейсов. Совокупность определений методов, объявленных в интерфейсе, называется реализацией интерфейса, т.е. объектный тип реализует все свои базовые интерфейсы.

Пример

ИНТЕРФЕЙС Инт1
[ 
  ФУНКЦИЯ м1; 
]

ИНТЕРФЕЙС Инт2
[ 
  ФУНКЦИЯ м2; 
]

ТИП Об (Инт1, Инт2)
[
  СТРОКА: данные;
  //переопределение методов интерфейса
  ФУНКЦИЯ м1 
    СООБЩЕНИЕ("Вызван метод м1") 
  КОНЕЦ_ФУНКЦИИ	
  ФУНКЦИЯ м2 
    СООБЩЕНИЕ("Вызван метод м2") 
  КОНЕЦ_ФУНКЦИИ
]
ВЫЧИСЛИТЬ

  ПЕРЕМ Об: об
  ПЕРЕМ Инт1: инт1 = об	
  ПЕРЕМ Инт2: инт2 = об	
  инт1.м1

КОНЕЦ

Предусматривается возможность владения значения типа интерфейс значением реализующего объектного типа. При этом не создается переменной объектного типа. Анонимное объектное значение удаляется при удалении последнего интерфейсного значения, ссылающегося на него. Для создания анонимного объектного значения и возврата владеющего им интерфейса введено новое использование ключевого слова СОЗДАТЬ.

Синтаксис

<переменная интерфейса> = СОЗДАТЬ(<имя интерфейса>, <имя объектного типа>)

Пример

ПЕРЕМ Инт2: инт2 = СОЗДАТЬ(Инт2, Об)

Для непосредственного доступа к объектному значению через интерфейс применяется ключевое слово ОБЪЕКТ.

Синтаксис

ОБЪЕКТ(<выражение>, <имя объектного типа>)

В следующем примере рассматривается ситуация получения доступа к полю "данные" объектного типа Об через интерфейс.

Пример

ИНТЕРФЕЙС Инт1 
[
  ФУНКЦИЯ м1;
]

ИНТЕРФЕЙС Инт2 
[
  ФУНКЦИЯ м2;
]

ТИП Об (Инт1, Инт2)
[
   СТРОКА: данные;
   ФУНКЦИЯ м1 
     СООБЩЕНИЕ("Вызван метод м1")  
   КОНЕЦ_ФУНКЦИИ
   ФУНКЦИЯ м2 
     СООБЩЕНИЕ("Вызван метод м2")  
   КОНЕЦ_ФУНКЦИИ
]

ВЫЧИСЛИТЬ

  ПЕРЕМ Об: об = [ данные = "привет мир" ]
  ПЕРЕМ Инт1: инт1 = об
  ОТЛАДКА(ОБЪЕКТ(инт1, Об))

КОНЕЦ

Для проверки возможности доступа к объектному значению указанного типа также применяется ключевое слово ОБЪЕКТ.

Синтаксис

ОБЪЕКТ(<выражение>, &<имя объектного типа>)

Эта конструкция возвращает значение логического типа. В случае возможности доступа к объекту указанного типа или производного типа возвращается ДА.

Пример

ИНТЕРФЕЙС Инт 
[
  ФУНКЦИЯ м;
]

ТИП Об1(Инт)
[
   СТРОКА: текст;
   ФУНКЦИЯ м 
     СООБЩЕНИЕ("Вызван метод м")  
   КОНЕЦ_ФУНКЦИИ
]

ТИП Об2(Инт)
[
   ЧИСЛО: количество;
   ФУНКЦИЯ м 
     СООБЩЕНИЕ("Вызван метод м")  
   КОНЕЦ_ФУНКЦИИ
]

ВЫЧИСЛИТЬ
  ПЕРЕМ Об1: об = [ текст = "привет мир" ]
  ПЕРЕМ Инт: инт = об
  ОТЛАДКА(ОБЪЕКТ(инт, &Об1)) // ДА
  ОТЛАДКА(ОБЪЕКТ(инт, &Об2)) // НЕТ
КОНЕЦ

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

В примере, представленном ниже, только объект типа Об реализует интерфейсы Инт1 и Инт2.

Пример

ИНТЕРФЕЙС Инт1
[
  ФУНКЦИЯ м1;
]

ИНТЕРФЕЙС Инт2
[
  ФУНКЦИЯ м2;
]

ТИП Об(Инт1, Инт2)
[
  ЧИСЛО: данные;
  ФУНКЦИЯ м1 
    СООБЩЕНИЕ("Вызван метод м1") 
  КОНЕЦ_ФУНКЦИИ
  ФУНКЦИЯ м2 
    СООБЩЕНИЕ("Вызван метод м2")  
  КОНЕЦ_ФУНКЦИИ
]
ВЫЧИСЛИТЬ

  ПЕРЕМ Об: об = [ данные = 100 ]
  ПЕРЕМ Инт1: инт1 = об
  ПЕРЕМ инт2 = ИНТЕРФЕЙС(инт1, Инт2) // запрашиваем Инт2 через Инт1
  ОТЛАДКА(инт1) // Об
  ОТЛАДКА(инт2) // Об
КОНЕЦ

См. также: