Текущее время: Чт, июн 21 2018, 21:40

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


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


ВНИМАНИЕ!

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



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

Зарегистрирован:
Пт, июл 27 2007, 14:06
Сообщения: 105
Добрый день.

Вот такой пример:
Code:
REPORT.

INTERFACE lif_common.
  METHODS command IMPORTING command TYPE csequence.
ENDINTERFACE.

CLASS lcl_common DEFINITION ABSTRACT.
  PUBLIC SECTION.
    INTERFACES lif_common.
ENDCLASS.

CLASS lcl_common IMPLEMENTATION.
  METHOD lif_common~command.
    DATA(method) = |DO_{ command }|.
    TRY .
      CALL METHOD me->(method).
    CATCH CX_SY_DYN_CALL_ILLEGAL_METHOD INTO DATA(oref).
      WRITE:/ oref->get_text( ).
    ENDTRY.
  ENDMETHOD.
ENDCLASS.

CLASS lcl_t1 DEFINITION INHERITING FROM lcl_common.
  PUBLIC SECTION.
    METHODS do_t2.
  PROTECTED SECTION.
    METHODS do_t1.
ENDCLASS.

CLASS lcl_t1 IMPLEMENTATION.
  METHOD do_t1.
    WRITE:/ 'lcl_t1->do_t1 protected'.
  ENDMETHOD.

  METHOD do_t2.
    WRITE:/ 'lcl_t1->do_t2 public'.
  ENDMETHOD.
ENDCLASS.


START-OF-SELECTION.

  DATA obj TYPE REF TO lif_common.

  obj = new lcl_t1( ).
  obj->command( command = 'T1' ).
  obj->command( command = 'T2' ).

В отладке при вызове CALL METHOD me->(method) me имеет тип LCL_T1. Т.е. вроде как класс хочет вызвать свой защищенный метод. Почему тогда выдается исключение? Потому что реализация вызова в родителе находится?..


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

Зарегистрирован:
Ср, дек 22 2010, 20:49
Сообщения: 107
Добрый день!
Добавьте интерфейс в друзья.
Code:
CLASS lcl_t1 DEFINITION INHERITING FROM lcl_common FRIENDS lif_common.

_________________
Человек готов работать 24 часа в сутки, лишь бы ничего не делать.


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

Зарегистрирован:
Пт, июл 27 2007, 14:06
Сообщения: 105
NeMurometz написал(а):
Добрый день!
Добавьте интерфейс в друзья.
Code:
CLASS lcl_t1 DEFINITION INHERITING FROM lcl_common FRIENDS lif_common.


Если у меня будет несколько наследников lcl_common, реализующих, например, разный функционал, мне каждому придется прописывать друга.


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

Зарегистрирован:
Пт, янв 18 2008, 11:34
Сообщения: 700
Откуда: Tashkent -> Astana -> Moscow
Пол: Мужской
читаем хелп по Protected Section и думаю вопрос сам по себе отпадет
Цитата:
All components of the class declared in the area behind the statement PROTECTED SECTION can be addressed directly only in the subclasses of the class and in the class itself (plus its friends), if allowed by the package concept. Protected methods in subclasses can be redefined.

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


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

Зарегистрирован:
Пт, июл 27 2007, 14:06
Сообщения: 105
Да, я знаю, что защищенные методы может вызывать только сам класс, его потомки и друзья.

В данном случае вызов динамический из родителя. Вопрос в чем: код метода lif_common~command вызвается на уровне родителя и поэтому доступ не положен, несмотря на то, что me имеет тип необходимого класса (lcl_t1 в данном случае) и вроде как класс вызывает свой защищенный метод?..

Т.е., условно логика такая получается:
1) Вызываем lcl_t1->command
2) lcl_t1 "говорит" - нет у меня такого метода, он у родителя есть
3) Выполнение уходит в lcl_common->command
4) lcl_common не имеет доступа к защищенному методу потомка
5) ошибка
?


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

Зарегистрирован:
Пт, янв 18 2008, 11:34
Сообщения: 700
Откуда: Tashkent -> Astana -> Moscow
Пол: Мужской
да верно, вызов осуществлен извне поэтому и исключение. И тут не важно что динамический вызов и тип ссылается на необходимый класс.

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


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

Зарегистрирован:
Чт, мар 25 2010, 10:02
Сообщения: 207
Оффтоп. А вам не нужно что-то вроде Команда или Стратегия?


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

Зарегистрирован:
Пт, июл 27 2007, 14:06
Сообщения: 105
AFH написал(а):
Оффтоп. А вам не нужно что-то вроде Команда или Стратегия?


Неплохая мысль... Пощупаю, пожалуй, команду. Спасибо. Может хоть где-то присобачу паттерн :lol:


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

Зарегистрирован:
Пн, фев 14 2011, 08:26
Сообщения: 66
Откуда: Альфа Центавра
Пол: Мужской
мои 5 копеек
про вызов protected метода вроде все просто

создавать callback-и или реализовывать интерфейс в ABAP не очень удобно (создавать DEFINITION и IMPLEMENTATION в локальных классах долго)
лямбда выражений тоже нет

передачу параметров в методы можно реализовать след-м способом
в 7.5 выглядит компактно

Code:
REPORT zzz1.

INTERFACE lif_common.
  METHODS command IMPORTING method TYPE csequence
                            params TYPE abap_parmbind_tab OPTIONAL.
ENDINTERFACE.

CLASS lcl_common DEFINITION ABSTRACT.
  PUBLIC SECTION.
    INTERFACES lif_common.
ENDCLASS.

CLASS lcl_common IMPLEMENTATION.
  METHOD lif_common~command.
    TRY .
        CALL METHOD me->(method)
          PARAMETER-TABLE params.
      CATCH cx_sy_dyn_call_illegal_method INTO DATA(oref).
        WRITE:/ oref->get_text( ).
    ENDTRY.
  ENDMETHOD.
ENDCLASS.

CLASS lcl_t1 DEFINITION INHERITING FROM lcl_common.
  PUBLIC SECTION.
    METHODS print_name
      IMPORTING
        iv_name TYPE csequence.

    METHODS power_2
      IMPORTING
                iv_number        TYPE numeric
      RETURNING VALUE(rv_result) TYPE i.
ENDCLASS.

CLASS lcl_t1 IMPLEMENTATION.
  METHOD print_name.
    WRITE:/ iv_name COLOR 1.
  ENDMETHOD.

  METHOD power_2.
    rv_result = iv_number ** 2.
  ENDMETHOD.
ENDCLASS.


START-OF-SELECTION.

  DATA obj TYPE REF TO lif_common.

  obj = NEW lcl_t1( ).

  " Передача имени
  obj->command( method = 'PRINT_NAME' params = VALUE #(
   ( name  = 'IV_NAME'
     kind  = cl_abap_objectdescr=>exporting
     value = REF #( 'John Doe' )   )
  ) ).

  " Квадрат значения
  DATA: lv_result TYPE i.
  obj->command( method = 'POWER_2' params = VALUE #(
   ( name  = 'IV_NUMBER'
     kind  = cl_abap_objectdescr=>exporting
     value = REF #( 5 ) )
   ( name  = 'RV_RESULT'
     kind  = cl_abap_objectdescr=>receiving
     value = REF #( lv_result ) )
  ) ).
  WRITE / lv_result COLOR 2.


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

Зарегистрирован:
Чт, дек 20 2007, 19:21
Сообщения: 1072
Скоро тут будет "как сделать аналог Javascript на ABAP" :D

_________________
я твой сап эфай внедрял
BAdI-позитив


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

Зарегистрирован:
Пт, янв 18 2008, 11:34
Сообщения: 700
Откуда: Tashkent -> Astana -> Moscow
Пол: Мужской
тут единственная ошибка в вашей реализации, что вы объявили метод как protected. смысла в этом не вижу.

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


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

Зарегистрирован:
Чт, окт 06 2005, 17:44
Сообщения: 2924
Откуда: Москва
Kengur написал(а):
Скоро тут будет "как сделать аналог Javascript на ABAP" :D

:pivo:

_________________
С уважением,
Удав.


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

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


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

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


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

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