Инкапсуляция — механизм языка программирования, ограничивающий доступ к составляющим объект компонентам (методам и свойствам), делает их приватными, то есть доступными только внутри объекта. Является важным инструментом ООП наряду с полиморфизмом, наследованием и абстракцией данных.
Как известно в ABAP можно получить доступ к приватному атрибуту другого класса, если класс запрашивающий атрибут является другом. Кроме этого способа, доступ к приватному атрибуту можно получить если мы сможем получить ссылку на него:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
CLASS lcl_test DEFINITION. PUBLIC SECTION. CLASS-METHODS: get_var_ref RETURNING VALUE(ir_var) TYPE REF TO STRING. PRIVATE SECTION. CLASS-DATA: gv_var TYPE STRING VALUE 'old'. ENDCLASS. CLASS lcl_test IMPLEMENTATION. METHOD get_var_ref. GET REFERENCE OF gv_var INTO ir_var. ENDMETHOD. ENDCLASS. FIELD-SYMBOLS: <gv_var> TYPE STRING. DATA: gr_var TYPE REF TO STRING. START-OF-SELECTION. ASSIGN ('lcl_test=>gv_var') TO <gv_var>. IF <gv_var> IS ASSIGNED. WRITE <gv_var>. ELSE. WRITE 'Доступ к приватному атрибуту нельзя получить через ASSIGN'. ENDIF. gr_var = lcl_test=>get_var_ref( ). ASSIGN gr_var->* TO <gv_var>. CHECK <gv_var> IS ASSIGNED. <gv_var> = 'new'. WRITE: / 'Приватный атрибут получен, значение:', <gv_var>. |
В официальной документации сказано следующее:
If references are set using GET REFERENCE, permission to access the data object in question is only checked at the position of the statement. After that, the references can be passed on to any destination and the associated data objects can be accessed from any position using the references. To prevent access to private and read-only attributes using references outside classes, do not publish references to these attributes externally. A constant or read-only input parameter, however, can never be made modifiable by passing its reference.