Это преднамеренное и следует объектно-ориентированному дизайну.
PROTECTED
- это односторонний маршрут: вы можете использовать его, чтобы сделать атрибуты родителей видимыми у детей, но не наоборот. Ваш пример пробует именно это запрещенное противоположное направление.
Точнее, любой класс сможет когда-либо иметь доступ только к собственным методам, которые были либо определены сами по себе, либо унаследованы как publi c, либо защищены от своего суперкласса. xyz
не определен ни в zcl_foo
, ни в суперклассе, поэтому zcl_foo
не может его увидеть.
К сожалению, ваш пример на самом деле не объясняет, зачем вам нужен этот динамический c вызов. Типичным шаблоном в ориентации объекта будет то, что zcl_foo
объявляет xyz
как protected
, а zcl_qux
переопределяет этот метод.
То, что вы могли бы сделать, таково:
CLASS parent DEFINITION PUBLIC CREATE PUBLIC.
PUBLIC SECTION.
METHODS call_sub.
PROTECTED SECTION.
DATA method_name TYPE string.
ENDCLASS.
CLASS parent IMPLEMENTATION.
METHOD call_sub.
CALL METHOD (method_name).
ENDMETHOD.
ENDCLASS.
Затем переопределите call_sub
в каждом подклассе:
CLASS child DEFINITION PUBLIC CREATE PUBLIC
INHERITING FROM zcl_fh_so_parent.
PUBLIC SECTION.
METHODS constructor.
METHODS call_sub REDEFINITION.
PROTECTED SECTION.
METHODS call_me.
ENDCLASS.
CLASS child IMPLEMENTATION.
METHOD constructor.
super->constructor( ).
method_name = `CALL_ME`.
ENDMETHOD.
METHOD call_sub.
CALL METHOD (method_name).
ENDMETHOD.
METHOD call_me.
DATA(success) = 'Hooray!'.
ENDMETHOD.
ENDCLASS.
Но этот шаблон на самом деле не имеет смысла для меня.