A class can be defined as a private friend of another class. The statement is like this: CLASS XYZ DEFINITION CREATE PRIVATE FRIENDS ABC. Here XYZ is the private friend class of ABC. Now the requisites are:
1. ABC can use all protected and private components of XYZ.
2. ABC can instantiate XYZ in its method.
Here we want to create a friend class and data and method in protected and private section. This friend class will be Instantiated from another class method and it will access all of its data and methods.
The following program contains a class XYZ which is a private friend class of ABC. Now we have defined protected data and private data in class XYZ. We also have defined a private method M_XYZ here. The method M_XYZ displays the protected and private data.
Now we have a public method M_ABC of class ABC. In the implementation of M_ABC, we have instantiated friend class and called method M_XYZ. Then we have changed the value of protected and private data and display those again.
Finally, in the START-OF-SELECTION, we just have instantiated the class ABC and called the method M_ABC. Hence we don't have to instantiate the friend class again as it has been instantiated before.
REPORT zprivate_friend.
*----------------------------------------------------------------------*
* CLASS ABC DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS abc DEFINITION.
PUBLIC SECTION.
METHODS m_abc.
ENDCLASS. "ABC DEFINITION
*----------------------------------------------------------------------*
* CLASS XYZ DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS xyz DEFINITION CREATE PRIVATE FRIENDS abc.
PROTECTED SECTION.
DATA v_pro TYPE char50.
PRIVATE SECTION.
DATA v_txt TYPE char50.
METHODS m_xyz.
ENDCLASS. "XYZ DEFINITION
*----------------------------------------------------------------------*
* CLASS ABC IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS abc IMPLEMENTATION.
METHOD m_abc.
DATA obj2 TYPE REF TO xyz.
CREATE OBJECT obj2.
CALL METHOD obj2->m_xyz.
obj2->v_pro = 'Protected Data of First Class'.
obj2->v_txt = 'Private Data of First Class'.
WRITE: / obj2->v_pro,
/ obj2->v_txt.
ENDMETHOD. "M_ABC
ENDCLASS. "ABC IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS XYZ IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS xyz IMPLEMENTATION.
METHOD m_xyz.
v_pro = 'Protected Data of Friend Class'.
v_txt = 'Private Data of Friend Class'.
WRITE: / 'Private Method:',
/ v_pro,
/ v_txt.
SKIP.
ENDMETHOD. "M_XYZ
ENDCLASS. "XYZ IMPLEMENTATION
* Start of selection
START-OF-SELECTION.
* Data Declaration
DATA obj1 TYPE REF TO abc.
* Create object
CREATE OBJECT obj1.
* Calling method
CALL METHOD obj1->m_abc.
Output