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/