Текущее время: Чт, мар 28 2024, 20:54

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: Yandex [Bot]


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

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