SAPфорум.RU https://sapboard.ru/forum/ |
|
Динамический вызов с динамической ссылкой на объект https://sapboard.ru/forum/viewtopic.php?f=13&t=96310 |
Страница 1 из 1 |
Автор: | pirt_m [ Чт, апр 19 2018, 10:41 ] |
Заголовок сообщения: | Динамический вызов с динамической ссылкой на объект |
Привет, кто знает решение: есть класс cl_some_class, создавать нельзя, метод get_instance: Code: class-methods GET_INSTANCE exporting !EO_INSTANCE type ref to IF_SOME_INTERFACE. Такой вызов, например, не работает: Code: data lo_inst type ref to interface. lt_par = value abap_parmbind_tab( ( name = 'EO_INSTANCE' kind = cl_abap_objectdescr=>importing value = ref #( lo_inst ) ) ). try. call method ('CL_SOME_CLASS')=>('GET_INSTANCE') parameter-table lt_par. catch сx_dyn_call_error. return. endtry. Как правильно указать ссылку на объект класса, реализующего интерфейс, при том, что в исходной dev-системе ни класса, ни интерфейса не существует? Понятно, что если я делаю data lo_inst type ref to if_some_existing_interface, то все работает, но это не вариант =( Заранее спасибо, если кто знает. |
Автор: | LAT [ Чт, апр 19 2018, 12:28 ] |
Заголовок сообщения: | Re: Динамический вызов с динамической ссылкой на объект |
pirt_m написал: Как правильно указать ссылку на объект класса, реализующего интерфейс, при том, что в исходной dev-системе ни класса, ни интерфейса не существует? Нужно писать код в той системе, где эти класс и интерфейс существуют. Или же Ваш вопрос сформулирован некорректно.
|
Автор: | LAT [ Чт, апр 19 2018, 12:31 ] |
Заголовок сообщения: | Re: Динамический вызов с динамической ссылкой на объект |
ЗЫ. Статические методы класса можно вызывать без создания экземпляра (если их область видимости позволяет). В частности, если GET_INSTANCE() находится в паблик-секции, Вы можете откуда угодно вызвать метод без динамики: CL_SOME_CLASS=>GET_INSTANCE( параметры вызова). |
Автор: | pirt_m [ Чт, апр 19 2018, 13:02 ] |
Заголовок сообщения: | Re: Динамический вызов с динамической ссылкой на объект |
LAT написал(а): pirt_m написал: Как правильно указать ссылку на объект класса, реализующего интерфейс, при том, что в исходной dev-системе ни класса, ни интерфейса не существует? Нужно писать код в той системе, где эти класс и интерфейс существуют. Или же Ваш вопрос сформулирован некорректно.Иногда бывает и такое. Вопрос сформулирован корректно, проблема именно такая. Есть два сценария - у клиента компонента присутствует или отсутствует. У нас интеграция, компоненты нет - код не выполняется. Но он уже должен быть в системе так или иначе. |
Автор: | LAT [ Чт, апр 19 2018, 13:30 ] |
Заголовок сообщения: | Re: Динамический вызов с динамической ссылкой на объект |
Так пробовали? Code: data lo_inst type ref to OBJECT.
data(name) = 'имя интерфейса'. create object lo_inst type (name). |
Автор: | Kengur [ Чт, апр 19 2018, 14:05 ] |
Заголовок сообщения: | Re: Динамический вызов с динамической ссылкой на объект |
Наверно стоит проверить программно наличие класса и от этого запускать свой код. Но имхо это ересь... |
Автор: | cnupt [ Чт, апр 19 2018, 14:45 ] |
Заголовок сообщения: | Re: Динамический вызов с динамической ссылкой на объект |
Нашел человека из базиса, который знает. В общем, кому интересно, работает вот так (уже протестировал): Code: data dref type ref to data. field-symbols <iref> type data. create data dref type ref to ('IF_SOME_INTERFACE'). assign dref->* to <iref>. call method ('CL_SOME_CLASS')=>('GET_INSTANCE') importing eo_instance = <iref>. Вся загвоздка, конечно, в приведении типов, что для EXPORTING параметров must. Например, для RETURNING такой жесткой проверки на типы нет и генерик работает, то есть можно просто объявить ссылку type ref to object, вызвать фабричный метод и получить экземпляр в генерик-ссылке. Можно закрывать, всем спасибо. |
Автор: | matik [ Пт, апр 20 2018, 16:04 ] |
Заголовок сообщения: | Re: Динамический вызов с динамической ссылкой на объект |
Цитата: Как правильно указать ссылку на объект класса, реализующего интерфейс если я вас правильно понял нужно вызвать стат метод интерфейса динамический (для получения instance) Code: CALL METHOD ('CL_SOME_CLASS')=>('ZIF_SOME_EXT~GET_INSTANCE') RECEIVING ro_instance = lo_ext. где Code: lo_ext TYPE REF TO ZIF_SOME_EXT в интерфейсе ZIF_SOME_EXT кроме стад объявления GET_INSTANCE есть и прочие instance методы |
Автор: | cnupt [ Вт, май 08 2018, 16:59 ] |
Заголовок сообщения: | Re: Динамический вызов с динамической ссылкой на объект |
matik написал: Цитата: где Code: lo_ext TYPE REF TO ZIF_SOME_EXT в интерфейсе ZIF_SOME_EXT кроме стад объявления GET_INSTANCE есть и прочие instance методы Поняли неправильно, в исходной системе интерфейса, как и класса, не существует в словаре, в принципе. Как я написал выше, весь фокус в том, чтобы инициализировать динамическую ссылку на структуру данных (type ref to data вместо type ref to object) с типом данного интерфейса (такой вот неявный "хак"), тогда динамический вызов 'GET_INSTANCE' сможет передать ссылку на объект в данную ссылку и с ней можно работать дальше как с нормальным экземпляром класса, реализующего интерфейс. |
Автор: | Кодер [ Вт, май 08 2018, 21:07 ] |
Заголовок сообщения: | Re: Динамический вызов с динамической ссылкой на объект |
Интересно, а просто использовать inline объявление не получится? Code: call method ('CL_SOME_CLASS')=>('GET_INSTANCE')
importing eo_instance = data #(lo_interf). |
Автор: | ghost [ Вт, май 08 2018, 22:20 ] |
Заголовок сообщения: | Re: Динамический вызов с динамической ссылкой на объект |
Кодер написал(а): Интересно, а просто использовать inline объявление не получится? Code: call method ('CL_SOME_CLASS')=>('GET_INSTANCE') importing eo_instance = data #(lo_interf). inline можно использовать только для статических вызовов. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |