Текущее время: Пт, мар 29 2024, 02:35

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: Динамический вызов с динамической ссылкой на объект
СообщениеДобавлено: Чт, апр 19 2018, 10:41 
Начинающий
Начинающий

Зарегистрирован:
Чт, апр 19 2018, 10:30
Сообщения: 2
Откуда: Walldorf
Пол: Мужской
Привет,

кто знает решение:

есть класс 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, то все работает, но это не вариант =(

Заранее спасибо, если кто знает.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Динамический вызов с динамической ссылкой на объект
СообщениеДобавлено: Чт, апр 19 2018, 12:28 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, май 12 2011, 16:06
Сообщения: 347
pirt_m написал:
Как правильно указать ссылку на объект класса, реализующего интерфейс, при том, что в исходной dev-системе ни класса, ни интерфейса не существует?
Нужно писать код в той системе, где эти класс и интерфейс существуют. Или же Ваш вопрос сформулирован некорректно.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамический вызов с динамической ссылкой на объект
СообщениеДобавлено: Чт, апр 19 2018, 12:31 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, май 12 2011, 16:06
Сообщения: 347
ЗЫ. Статические методы класса можно вызывать без создания экземпляра (если их область видимости позволяет). В частности, если GET_INSTANCE() находится в паблик-секции, Вы можете откуда угодно вызвать метод без динамики: CL_SOME_CLASS=>GET_INSTANCE( параметры вызова).


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамический вызов с динамической ссылкой на объект
СообщениеДобавлено: Чт, апр 19 2018, 13:02 
Начинающий
Начинающий

Зарегистрирован:
Чт, апр 19 2018, 10:30
Сообщения: 2
Откуда: Walldorf
Пол: Мужской
LAT написал(а):
pirt_m написал:
Как правильно указать ссылку на объект класса, реализующего интерфейс, при том, что в исходной dev-системе ни класса, ни интерфейса не существует?
Нужно писать код в той системе, где эти класс и интерфейс существуют. Или же Ваш вопрос сформулирован некорректно.


Иногда бывает и такое. Вопрос сформулирован корректно, проблема именно такая. Есть два сценария - у клиента компонента присутствует или отсутствует. У нас интеграция, компоненты нет - код не выполняется. Но он уже должен быть в системе так или иначе.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Динамический вызов с динамической ссылкой на объект
СообщениеДобавлено: Чт, апр 19 2018, 13:30 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, май 12 2011, 16:06
Сообщения: 347
Так пробовали?
Code:
data lo_inst type ref to OBJECT.
data(name) = 'имя интерфейса'.
create object lo_inst type (name).


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамический вызов с динамической ссылкой на объект
СообщениеДобавлено: Чт, апр 19 2018, 14:05 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, дек 20 2007, 18:21
Сообщения: 1613
Наверно стоит проверить программно наличие класса и от этого запускать свой код. Но имхо это ересь...

_________________
я твой сап эфай внедрял
BAdI-позитив
Взять немножечко абопу, сунь туда кошачью *опу, RFC лапки, БТ старой бабки, на медленном базиснике переносить, тестовое окружение материть, снимать SAT пенку, биться головой о стенку, охапка тайм-шитов, отчет готов!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамический вызов с динамической ссылкой на объект
СообщениеДобавлено: Чт, апр 19 2018, 14:45 
Начинающий
Начинающий

Зарегистрирован:
Ср, фев 22 2017, 09:09
Сообщения: 3
Нашел человека из базиса, который знает. В общем, кому интересно, работает вот так (уже протестировал):

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, вызвать фабричный метод и получить экземпляр в генерик-ссылке.

Можно закрывать, всем спасибо.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамический вызов с динамической ссылкой на объект
СообщениеДобавлено: Пт, апр 20 2018, 16:04 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Пн, фев 14 2011, 07:26
Сообщения: 80
Откуда: Альфа Центавра
Пол: Мужской
Цитата:
Как правильно указать ссылку на объект класса, реализующего интерфейс



если я вас правильно понял нужно вызвать стат метод интерфейса динамический (для получения 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 методы


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Динамический вызов с динамической ссылкой на объект
СообщениеДобавлено: Вт, май 08 2018, 16:59 
Начинающий
Начинающий

Зарегистрирован:
Ср, фев 22 2017, 09:09
Сообщения: 3
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' сможет передать ссылку на объект в данную ссылку и с ней можно работать дальше как с нормальным экземпляром класса, реализующего интерфейс.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамический вызов с динамической ссылкой на объект
СообщениеДобавлено: Вт, май 08 2018, 21:07 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1246
Интересно, а просто использовать inline объявление не получится?
Code:
call method ('CL_SOME_CLASS')=>('GET_INSTANCE')
  importing
    eo_instance = data #(lo_interf).

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамический вызов с динамической ссылкой на объект
СообщениеДобавлено: Вт, май 08 2018, 22:20 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Пт, янв 18 2008, 10:34
Сообщения: 716
Откуда: Moscow
Пол: Мужской
Кодер написал(а):
Интересно, а просто использовать inline объявление не получится?
Code:
call method ('CL_SOME_CLASS')=>('GET_INSTANCE')
  importing
    eo_instance = data #(lo_interf).


inline можно использовать только для статических вызовов.

_________________
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. (Э. Йодан)


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB