МЕТОД ВЫЗОВА и метод сцепления - PullRequest
0 голосов
/ 23 января 2019

Для CALL METHOD - Статический вызов метода (устарел), документация по ключевым словам ABAP гласит: «Если CALL METHOD используется для автономного вызова метода, цепные вызовы метода невозможны ...»

Тем не менее, следующее успешно выполняется в системе 7.40. Разве это не пример отдельного вызова метода? Или что я не так делаю?

REPORT ZUTEST3.

CLASS class_parent Definition.
   PUBLIC Section.
   METHODS m1 returning value(r) type ref to class_parent.
ENDCLASS.

CLASS class_parent Implementation. 
   Method m1.
       create object r.
       write / 'm1'.
   EndMethod.
ENDCLASS.

start-of-selection.
data cl type ref to class_parent.
CREATE OBJECT cl.
CALL METHOD cl->m1( )->m1( ).

Редактировать: Отказ от ответственности

Мы пишем инструмент на Java, который анализирует и преобразует ABAP-код. В частности, мы не собираемся писать новый код ABAP. Но вместо этого наш инструмент должен обрабатывать все ABAP, даже устаревшие операторы и непонятные варианты синтаксиса. Кроме того, я хотел бы отметить, что я не эксперт ABAP.

Ответы [ 3 ]

0 голосов
/ 24 января 2019

Прежде всего, метод m1 не является статичным в вашем примере, и цитата из документации гласит, что речь идет о статическом методе (CLASS-METHOD).

Единственно возможная вещь можетбыть похожим на этот пример.

REPORT zutest3.

CLASS class_parent DEFINITION.
  PUBLIC SECTION.
    METHODS m1 RETURNING VALUE(r) TYPE REF TO class_parent.
    CLASS-METHODS m1_static RETURNING VALUE(r) TYPE REF TO class_parent.
ENDCLASS.

CLASS class_parent IMPLEMENTATION.
  METHOD m1.
    CREATE OBJECT r.
    WRITE / 'm1'.
  ENDMETHOD.

  METHOD m1_static.
    CREATE OBJECT r.
    WRITE / 'm2'.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
* this seems to be possible but no one sane calls a static method on an object reference
  CALL METHOD class_parent=>m1_static( )->m1_static( ).
* the following two are not possible and will not compile either
*  CALL METHOD class_parent=>m1_static( )=>m1_static( ).
*  class_parent=>m1_static( )=>m1_static( ).

Второй из всех операторов CALL METHOD в этом случае - просто избыточность, а его роль только информативна.

Эти два эквивалента

CALL METHOD cl->m1( ).
cl->m1( ).

аналогично, например, этому

DATA i TYPE i.
COMPUTE i = i + 1.
i = i + 1.
0 голосов
/ 27 февраля 2019

Ошибка в документации. Я сообщил об этом команде документооборота, и они ответили, что об этом уже сообщалось, и исправили в последней версии.

Новый оператор:

Во втором варианте без круглых скобок вызовы метода связаны невозможны и операторы NEW и CAST не могут быть использованы.

0 голосов
/ 23 января 2019

Приложение 23 февраля, Флориан дает правильный ответ в комментариях: «Я сообщил об ошибке в команду документооборота, и они ответили, что она уже сообщена, и исправили ее в последней версии. Новое утверждение:« Во втором варианте без круглых скобок вызовы методов в цепочке невозможны, а операторы NEW и CAST не могут использоваться.» »

Ниже я приведу свой оригинальный ответ (кстати,Теперь я думаю, что в CALL METHOD static_meth... термин «вызов автономного метода» относится к части «static_meth», поэтому он относится к двум группам конструкций, поэтому мой ответ неточен, а ответ SAP на 100% правильный)


Как я вижу, в документации говорится, что термин "вызов автономного метода" относится к этим конструкциям (обратите внимание на использование скобок), которые объявлены устаревшими:

CALL METHOD method( ).
CALL METHOD method( 25 ).
CALL METHOD method( a = 1 ).
CALL METHOD method( EXPORTING a = 1 ).
CALL METHOD instance->method( ).
CALL METHOD class=>method( ).
etc.

Термин «автономный вызов метода» не относится к этим конструкциям:

CALL METHOD method.
CALL METHOD method EXPORTING a = 1.
CALL METHOD instance->method.
CALL METHOD class=>method.
etc.

Я полагаю, что CALL METHOD cl->m1( ) относится к первой группе const есть ошибка в документации .

Вероятно, отсутствует , а не , поскольку он должен применяться ко второй группе конструкций (например, CALL METHOD method->method( )недопустимо).

Заключение от меня: вы должны прочитать: «Если CALL METHOD не используется для автономного вызова метода, цепные вызовы метода невозможны ...»

Заключение от Florian & SAP: В комментариях ниже Florian обратился в службу поддержки SAP и указал, какое именно предложение SAP следует использовать в следующем официальном выпуске документации


ADDENDUM (прочитайте его, если вы ошиблись, считая, что страница документации посвящена «статическим методам», надеюсь, я поясню, что это не так).

Ответы на этот вопрос доказывают, что документация "ВЫЗОВМЕТОД - Статический вызов метода (устарел) " является весьма запутанным .

Название документации: здесь" статический вызов метода "означает " статический вызов методов " не«вызов статических методов» (хотя в других местах это может иметь такое значение).Если бы мы могли добавить круглые скобки в письменном языке, это дало бы эти две возможности, соответственно:

  • static (вызов метода) : статический вызов метода (каким бы ни был этот метод)типа «статический» или «экземпляр»; у нас может быть статический вызов метода экземпляра)
  • (статический метод) вызов : вызов статического метода

Определения:

  • статический вызов : имена классов, интерфейсов или методов «жестко закодированы» как символы в исходном коде, а не текстовые литералы, так что они известныкомпилятором (например, CALL METHOD class=>method.).Напротив, динамический вызов означает, что имена передаются через переменные, которые известны только во время выполнения (например, DATA classvar TYPE seoclsname VALUE 'CL_ABAP_TYPEDESCR'. CALL METHOD (classvar)=>(methodvar).). Эта другая страница документации хорошо показывает, что «вызов статического метода» противоположенчто касается «динамического вызова метода», то никогда не говорит о «статических методах и методах экземпляра», только о «статическом вызове метода» и «динамическом вызове метода».
  • статический метод : метод, объявленный с CLASS-METHODS.Например, статический вызов может быть cl_ixml=>create( ), а динамический вызов может быть DATA classvar TYPE seoclsname VALUE 'CL_IXML'. CALL METHOD (classvar)=>create.

Что-то в документации, которая меня тоже смутила, это использование термина «статический метод»и примеры, основанные только на статическом методе, потому что на самом деле страница документации посвящена «статическому вызову», а не статическим методам (могли использоваться методы экземпляра):

  • Синтаксис :CALL METHOD { static_meth( ) | static_meth( a ) | ...: что означает здесь "static_meth"?На самом деле «static_meth» не означает, что это статический метод, но это любой метод в контексте статического вызова метода .Если вы посмотрите на страницы документации о « статических вызовах » и « динамических вызовах », вы увидите, что синтаксис соответственно static_meth( ) ... и CALL METHOD dynamic_meth ...
  • Пример : статический метод снова используется в трех вызовах, причем все три имеют одинаковое точное значение, но записаны с разным синтаксисом, чтобы продемонстрировать, что первые два вызова устарели, и только третий рекомендуется. Фактически, во всех трех примерах лучше использовать метод экземпляра, чтобы избежать путаницы!
...