|
| 1 | +# Делегаты |
| 2 | + |
| 3 | +Делегаты в фреймворке ФИНТ позволяют создавать ссылки на методы объектов, реализуя механизм указателей на функции. Это достигается через автоматическую генерацию специальных методов с суффиксом "Ссылка" (например, `МойМетодСсылка`), которые возвращают объект класса `Действие`. Объект `Действие` инкапсулирует экземпляр объекта и имя метода, обеспечивая отложенный вызов с сохранением контекста. Делегаты поддерживают полиморфизм: в случае наследования вызывается реализация из дочернего класса. |
| 4 | + |
| 5 | +## Введение |
| 6 | + |
| 7 | +Делегаты заменяют лямбда-выражения или анонимные функции в среде строгой типизации OneScript, позволяя передавать поведение методов как параметры или хранить в свойствах. Они генерируются автоматически для всех экспортных методов классов во время инициализации фреймворка. |
| 8 | + |
| 9 | +**Преимущества:** |
| 10 | +- Типобезопасность: Проверки типов параметров и возвращаемого значения на этапе выполнения. |
| 11 | +- Интеграция с ООП: Поддержка наследования и полиморфизма — делегаты от базового класса могут вызывать переопределенные методы в наследниках. |
| 12 | +- Гибкость: Передача методов в коллекции, использование в обработчиках событий. |
| 13 | + |
| 14 | +Связанные механизмы: [Интерфейсы](interfaces.md) для контрактов методов, [Методы](methods.md) для объявления экспортных процедур/функций. |
| 15 | + |
| 16 | +## Использование |
| 17 | + |
| 18 | +1. **Создание ссылки:** Вызовите метод `ИмяМетодаСсылка()` на экземпляре объекта. Возвращается объект `Действие`. |
| 19 | +2. **Выполнение:** Для процедур — `Действие.Выполнить(параметры...)`; для функций — `Результат = Действие.Выполнить(параметры...)`. |
| 20 | +3. **Передача:** Делегаты можно хранить в свойствах (`&Действие Обработчик;`), передавать в методы или коллекции. |
| 21 | +4. **Проверки типов:** Фреймворк проверяет соответствие типов параметров и возвращаемого значения. |
| 22 | + |
| 23 | +**Методы объекта `Действие`:** |
| 24 | + |
| 25 | +| Метод | Параметры | Возврат | Описание | |
| 26 | +|-----------|--------------------|------------------|----------| |
| 27 | +| Выполнить | Аргументы метода | Результат (для функций) | Выполняет оригинальный метод с переданными аргументами. Для процедур — без возврата. | |
| 28 | + |
| 29 | +**Примечание:** Делегаты привязаны к экземпляру объекта (`ЭтотОбъект`), поэтому полиморфизм достигается через наследование. |
| 30 | + |
| 31 | +## Примеры |
| 32 | + |
| 33 | +### Простой пример: Делегат для процедуры |
| 34 | + |
| 35 | +В классе `ВходящийЗапрос` (из `fint_web`) объявлен экспортный метод `ВызовПроцедурыИзДелегата`. Фреймворк генерирует `ВызовПроцедурыИзДелегатаСсылка`. |
| 36 | + |
| 37 | +```bsl |
| 38 | +ОбъектВходящегоЗапроса = ВходящийЗапрос.Создать(); // Создание экземпляра |
| 39 | +Действие = ОбъектВходящегоЗапроса.ВызовПроцедурыИзДелегатаСсылка(); // Получение делегата |
| 40 | +Действие.Выполнить("Привет из корня"); // Вызов: выводит сообщение через оригинальный метод |
| 41 | +``` |
| 42 | + |
| 43 | +### Пример: Делегат для функции |
| 44 | + |
| 45 | +Аналогично для функции `ВызовФункцииИзДелегата` (возвращает строку). |
| 46 | + |
| 47 | +```bsl |
| 48 | +ТекстИзДелегата = ОбъектВходящегоЗапроса.ВызовФункцииИзДелегатаСсылка().Выполнить(); // Вызов без параметров, результат в переменную |
| 49 | +Сообщить(ТекстИзДелегата); // Вывод: строка от оригинального метода |
| 50 | +``` |
| 51 | + |
| 52 | +## Ограничения |
| 53 | + |
| 54 | +- **Только экспортные методы:** Делегаты генерируются исключительно для публичных (`Экспорт`) методов. Неэкспортные игнорируются. |
| 55 | +- **Привязка к экземпляру:** Делегат работает только с конкретным объектом. Хранение ссылки на уничтоженный объект приведет к ошибке выполнения. |
| 56 | +- **Типизация:** Параметры и возвращаемое значение проверяются динамически. Несоответствие вызовет исключение. |
| 57 | +- **Производительность:** Генерация и вызов через `Действие` добавляют overhead; используйте для динамических сценариев, не для hot paths. |
| 58 | + |
| 59 | +> **Предупреждение:** Избегайте циклических ссылок с делегатами — может привести к утечкам памяти. |
0 commit comments