Friendship is one sided. That means if a class XYZ is defined with Friends of ABC then ABC can access all of the protected and private components of XYZ but not vice versa. If XYZ wants to access all components of ABC then ABC will have to be defined by Friends of XYZ. Otherwise, compile error will come in the case of accessing ABC components like below:
REPORT zprivate_friendship_1sided.
CLASS abc DEFINITION DEFERRED.
*----------------------------------------------------------------------*
* CLASS XYZ DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS xyz DEFINITION FRIENDS abc.
PUBLIC SECTION.
METHODS meth2.
PROTECTED SECTION.
DATA v2_pro TYPE char50.
PRIVATE SECTION.
DATA v2_pri TYPE char50.
METHODS m_xyz.
ENDCLASS. "XYZ DEFINITION
*----------------------------------------------------------------------*
* CLASS ABC DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS abc DEFINITION FRIENDS xyz.
PUBLIC SECTION.
METHODS meth1.
PROTECTED SECTION.
DATA v1_pro TYPE char50.
PRIVATE SECTION.
DATA v1_pri TYPE char50.
METHODS m_abc.
ENDCLASS. "ABC DEFINITION
*----------------------------------------------------------------------*
* CLASS XYZ IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS xyz IMPLEMENTATION.
METHOD meth2.
DATA obj1 TYPE REF TO abc.
CREATE OBJECT obj1.
CALL METHOD obj1->m_abc.
ENDMETHOD. "meth2
METHOD m_xyz.
v2_pro = 'Protected Data Class 2'.
v2_pri = 'Private Data Class 2'.
WRITE: / 'Private Method of Class 2:',
/ v2_pro,
/ v2_pri.
SKIP.
ENDMETHOD. "m_XYZ
ENDCLASS. "XYZ IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS ABC IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS abc IMPLEMENTATION.
METHOD meth1.
DATA obj2 TYPE REF TO xyz.
CREATE OBJECT obj2.
CALL METHOD obj2->m_xyz.
ENDMETHOD. "meth1
METHOD m_abc.
v1_pro = 'Protected Data Class 1'.
v1_pri = 'Private Data Class 1'.
WRITE: / 'Private Method of Class 1:',
/ v1_pro,
/ v1_pri.
SKIP.
ENDMETHOD. "m_ABC
ENDCLASS. "ABC IMPLEMENTATION
* Start of selection
START-OF-SELECTION.
* Data Declaration
DATA: obj1 TYPE REF TO abc,
obj2 TYPE REF TO xyz.
* Object creation
CREATE OBJECT: obj1, obj2.
* method call
CALL METHOD: obj2->meth2,
obj1->meth1.
Output
Now let's remove the friendship of class ABC with class XYZ as shown in below code
CLASS abc DEFINITION DEFERRED.
*----------------------------------------------------------------------*
* CLASS XYZ DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS xyz DEFINITION FRIENDS abc.
PUBLIC SECTION.
METHODS meth2.
PROTECTED SECTION.
DATA v2_pro TYPE char50.
PRIVATE SECTION.
DATA v2_pri TYPE char50.
METHODS m_xyz.
ENDCLASS. "XYZ DEFINITION
*----------------------------------------------------------------------*
* CLASS ABC DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
*CLASS abc DEFINITION FRIENDS xyz.
CLASS abc DEFINITION.
PUBLIC SECTION.
METHODS meth1.
PROTECTED SECTION.
DATA v1_pro TYPE char50.
PRIVATE SECTION.
DATA v1_pri TYPE char50.
METHODS m_abc.
ENDCLASS. "ABC DEFINITION
Error Message