Skip to content

Работа с интерфейсами ​

Библиотека предоставляет аннотацию &Реализует, которая позволяет указать, что класс должен реализовать указанный интерфейс. Интерфейс должен быть представлен классом, имя которого и указывается в аннотации.

Для семантического обозначения интерфейсов рекомендуется использовать аннотацию &Интерфейс на конструкторе класса-интерфейса.

bsl
&Интерфейс
Процедура ПриСозданииОбъекта()
КонецПроцедуры

Процедура МойМетод() Экспорт
КонецПроцедуры
bsl
Процедура МойМетод()
    Сообщить("Реализация метода");
КонецПроцедуры

&Реализует("МойИнтерфейс")
Процедура ПриСозданииОбъекта()
КонецПроцедуры

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

bsl
#Использовать extends

ВалидаторРеализации = Новый ВалидаторРеализации();
ВалидаторРеализации.ИнтерфейсыРеализованыКорректно(Тип("МойКласс"));

В случае, если класс не реализует все методы интерфейса, будет выброшено исключение. Под реализацией подразумевается наличие всех методов интерфейса с совпадающим количеством параметров метода.

ИнтерфейсыРеализованыКорректно проверяет только интерфейсы, которые объект объявил сам: объект без аннотации &Реализует проверку проходит.

Чтобы потребовать от объекта конкретный интерфейс, используйте функцию РеализуетИнтерфейс. Она проверяет, что объект объявляет интерфейс аннотацией &Реализует (напрямую или через интерфейс, который его расширяет) и реализует все его методы. Так проверяют, например, объекты, которые библиотека получает от пользователя.

bsl
#Использовать extends

ВалидаторРеализации = Новый ВалидаторРеализации();

// Истина или Ложь
Реализует = ВалидаторРеализации.РеализуетИнтерфейс(Объект, "МойИнтерфейс");

// Исключение с причиной: интерфейс не объявлен или перечислены нереализованные методы
ВалидаторРеализации.РеализуетИнтерфейс(Объект, "МойИнтерфейс", Истина);

Проверяются методы только запрошенного интерфейса и интерфейсов, которые он расширяет; другие интерфейсы объекта не проверяются. Если у интерфейса нет аннотации &Интерфейс или класс интерфейса не найден, исключение вызывается всегда: это ошибка в вызывающем коде, а не в проверяемом объекте.

Класс может объявлять, что он реализует несколько интерфейсов, повторяя аннотацию &Реализует для каждого интерфейса.

bsl
&Реализует("МойИнтерфейс")
&Реализует("МойДругойИнтерфейс")
Процедура ПриСозданииОбъекта()
КонецПроцедуры

Расширение интерфейсов ​

Интерфейсы могут расширять другие интерфейсы через аннотацию &Расширяет, что обеспечивает наследование интерфейсов. Когда класс реализует интерфейс, он должен также реализовать все методы интерфейсов, которые этот интерфейс расширяет.

bsl
&Интерфейс
Процедура ПриСозданииОбъекта()
КонецПроцедуры

Процедура БазовыйМетод() Экспорт
КонецПроцедуры
bsl
&Интерфейс
&Расширяет("БазовыйИнтерфейс")
Процедура ПриСозданииОбъекта()
КонецПроцедуры

Процедура ДополнительныйМетод() Экспорт
КонецПроцедуры
bsl
Процедура БазовыйМетод()
    Сообщить("Реализация базового метода");
КонецПроцедуры

Процедура ДополнительныйМетод()
    Сообщить("Реализация дополнительного метода");
КонецПроцедуры

&Реализует("РасширенныйИнтерфейс")
Процедура ПриСозданииОбъекта()
КонецПроцедуры

Класс МойКласс объявляет, что он реализует интерфейс РасширенныйИнтерфейс и должен содержать как метод ДополнительныйМетод, так и унаследованный метод БазовыйМетод из БазовыйИнтерфейс.