Подобно классам в ABAP, интерфейсы действуют как типы данных для объектов. Компоненты интерфейсов такие же, как компоненты классов. В отличие от объявления классов, объявление интерфейса не включает разделы видимости. Это связано с тем, что компоненты, определенные в объявлении интерфейса, всегда интегрированы в раздел публичной видимости классов.
Интерфейсы используются, когда два одинаковых класса имеют метод с одинаковым именем, но функциональные возможности отличаются друг от друга. Интерфейсы могут выглядеть аналогично классам, но функции, определенные в интерфейсе, реализованы в классе для расширения области действия этого класса. Интерфейсы вместе с функцией наследования обеспечивают основу для полиморфизма. Это потому, что метод, определенный в интерфейсе, может вести себя по-разному в разных классах.
Ниже приведен общий формат для создания интерфейса:
INTERFACE <intf_name>. DATA..... CLASS-DATA..... METHODS..... CLASS-METHODS..... ENDINTERFACE.
В этом синтаксисе <intf_name> представляет имя интерфейса. Операторы DATA и CLASSDATA могут использоваться для определения экземпляра и статических атрибутов интерфейса соответственно. Операторы METHODS и CLASS-METHODS могут использоваться для определения экземпляра и статических методов интерфейса соответственно. Поскольку определение интерфейса не включает в себя класс реализации, нет необходимости добавлять предложение DEFINITION в объявление интерфейса.
Примечание. Все методы интерфейса являются абстрактными. Они полностью объявлены, включая их интерфейс параметров, но не реализованы в интерфейсе. Все классы, которые хотят использовать интерфейс, должны реализовывать все методы интерфейса. В противном случае класс становится абстрактным классом.
Мы используем следующий синтаксис в части реализации класса —
INTERFACE <intf_name>.
В этом синтаксисе <intf_name> представляет имя интерфейса. Обратите внимание, что этот синтаксис должен использоваться в открытом разделе класса.
Следующий синтаксис используется для реализации методов интерфейса внутри реализации класса:
METHOD <intf_name~method_m>. <statements>. ENDMETHOD.
В этом синтаксисе <intf_name ~ method_m> представляет полностью объявленное имя метода интерфейса <intf_name>.
пример
Report ZINTERFACE1. INTERFACE my_interface1. Methods msg. ENDINTERFACE. CLASS num_counter Definition. PUBLIC Section. INTERFACES my_interface1. Methods add_number. PRIVATE Section. Data num Type I. ENDCLASS. CLASS num_counter Implementation. Method my_interface1~msg. Write: / 'The number is', num. EndMethod. Method add_number. ADD 7 TO num. EndMethod. ENDCLASS. CLASS drive1 Definition. PUBLIC Section. INTERFACES my_interface1. Methods speed1. PRIVATE Section. Data wheel1 Type I. ENDCLASS. CLASS drive1 Implementation. Method my_interface1~msg. Write: / 'Total number of wheels is', wheel1. EndMethod. Method speed1. Add 4 To wheel1. EndMethod. ENDCLASS. Start-Of-Selection. Data object1 Type Ref To num_counter. Create Object object1. CALL Method object1→add_number. CALL Method object1→my_interface1~msg. Data object2 Type Ref To drive1. Create Object object2. CALL Method object2→speed1. CALL Method object2→my_interface1~msg.
Приведенный выше код производит следующий вывод —
The number is 7 Total number of wheels is 4
В приведенном выше примере my_interface1 — это имя интерфейса, содержащего метод msg. Далее, два класса, num_counter и drive1 определены и реализованы. Оба эти класса реализуют метод «msg», а также специальные методы, которые определяют поведение их соответствующих экземпляров, такие как методы add_number и speed1.
Примечание . Методы add_number и speed1 относятся к соответствующим классам.