Private Friends of a Class
A class can be defined as a private friend of another class. The statement is like this: CLASS cls2 DEFINITION CREATE PRIVATE FRIENDS cls1. Here cls2 is the private friend class of cls1. Now the requisites are:
1. cls1 can use all protected and private components of cls2.
2. cls1 can instantiate cls2 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 cls2 which is a private friend class of cls1. Now we have defined protected data and private data in class cls2. We also have defined a private method m_cls2 here. The method m_cls2 displays the protected and private data.
Now we have a public method m_cls1 of class cls1. In the implementation of m_cls1 we have instantiated friend class and called method m_cls2. 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 cls1 and called the method m_cls1. Hence we don't have to instantiate the friend class again as it has been instantiated before.
*&---------------------------------------------------------------------*
*& Report ZSR_TEST
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zsr_test.
*----------------------------------------------------------------------*
* CLASS cls1 DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cls1 DEFINITION.
PUBLIC SECTION.
METHODS m_cls1.
ENDCLASS. "cls1 DEFINITION
*----------------------------------------------------------------------*
* CLASS cls2 DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cls2 DEFINITION CREATE PRIVATE FRIENDS cls1.
PROTECTED SECTION.
DATA v_pro TYPE char50.
PRIVATE SECTION.
DATA v_txt TYPE char50.
METHODS m_cls2.
ENDCLASS. "cls2 DEFINITION
*----------------------------------------------------------------------*
* CLASS cls1 IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cls1 IMPLEMENTATION.
METHOD m_cls1.
DATA obj2 TYPE REF TO cls2.
CREATE OBJECT obj2.
CALL METHOD obj2->m_cls2.
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_cls1
ENDCLASS. "cls1 IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS cls2 IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cls2 IMPLEMENTATION.
METHOD m_cls2.
v_pro = 'Protected Data of Friend Class'.
v_txt = 'Private Data of Friend Class'.
WRITE: / 'Private Method:',
/ v_pro,
/ v_txt.
SKIP.
ENDMETHOD. "m_cls2
ENDCLASS. "cls2 IMPLEMENTATION
START-OF-SELECTION.
DATA obj1 TYPE REF TO cls1.
CREATE OBJECT obj1.
CALL METHOD obj1->m_cls1.
The output is as following:
Below is another version of the previous program and that will produce the same output. Here Definition Deferred has been used for defining cls1 class. The logic is same and we can use this procedure also. Here we have defined the friend class in another way like CLASS cls2 DEFINITION FRIENDS cls1.
*&---------------------------------------------------------------------*
*& Report ZSR_TEST
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zsr_test.
CLASS cls1 DEFINITION DEFERRED.
*----------------------------------------------------------------------*
* CLASS cls2 DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cls2 DEFINITION FRIENDS cls1.
PROTECTED SECTION.
DATA v_pro TYPE char50.
PRIVATE SECTION.
DATA v_txt TYPE char50.
METHODS m_cls2.
ENDCLASS. "cls2 DEFINITION
*----------------------------------------------------------------------*
* CLASS cls2 IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cls2 IMPLEMENTATION.
METHOD m_cls2.
v_pro = 'Protected Data of Friend Class'.
v_txt = 'Private Data of Friend Class'.
WRITE: / 'Private Method:',
/ v_pro,
/ v_txt.
SKIP.
ENDMETHOD. "m_cls2
ENDCLASS. "cls2 IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS cls1 DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cls1 DEFINITION.
PUBLIC SECTION.
METHODS m_cls1.
ENDCLASS. "cls1 DEFINITION
*----------------------------------------------------------------------*
* CLASS cls1 IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cls1 IMPLEMENTATION.
METHOD m_cls1.
DATA obj2 TYPE REF TO cls2.
CREATE OBJECT obj2.
CALL METHOD obj2->m_cls2.
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_cls1
ENDCLASS. "cls1 IMPLEMENTATION
START-OF-SELECTION.
DATA obj1 TYPE REF TO cls1.
CREATE OBJECT obj1.
CALL METHOD obj1->m_cls1.
A class can be defined as a private friend of another class. The statement is like this: CLASS cls2 DEFINITION CREATE PRIVATE FRIENDS cls1. Here cls2 is the private friend class of cls1. Now the requisites are:
1. cls1 can use all protected and private components of cls2.
2. cls1 can instantiate cls2 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 cls2 which is a private friend class of cls1. Now we have defined protected data and private data in class cls2. We also have defined a private method m_cls2 here. The method m_cls2 displays the protected and private data.
Now we have a public method m_cls1 of class cls1. In the implementation of m_cls1 we have instantiated friend class and called method m_cls2. 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 cls1 and called the method m_cls1. Hence we don't have to instantiate the friend class again as it has been instantiated before.
*&---------------------------------------------------------------------*
*& Report ZSR_TEST
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zsr_test.
*----------------------------------------------------------------------*
* CLASS cls1 DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cls1 DEFINITION.
PUBLIC SECTION.
METHODS m_cls1.
ENDCLASS. "cls1 DEFINITION
*----------------------------------------------------------------------*
* CLASS cls2 DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cls2 DEFINITION CREATE PRIVATE FRIENDS cls1.
PROTECTED SECTION.
DATA v_pro TYPE char50.
PRIVATE SECTION.
DATA v_txt TYPE char50.
METHODS m_cls2.
ENDCLASS. "cls2 DEFINITION
*----------------------------------------------------------------------*
* CLASS cls1 IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cls1 IMPLEMENTATION.
METHOD m_cls1.
DATA obj2 TYPE REF TO cls2.
CREATE OBJECT obj2.
CALL METHOD obj2->m_cls2.
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_cls1
ENDCLASS. "cls1 IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS cls2 IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cls2 IMPLEMENTATION.
METHOD m_cls2.
v_pro = 'Protected Data of Friend Class'.
v_txt = 'Private Data of Friend Class'.
WRITE: / 'Private Method:',
/ v_pro,
/ v_txt.
SKIP.
ENDMETHOD. "m_cls2
ENDCLASS. "cls2 IMPLEMENTATION
START-OF-SELECTION.
DATA obj1 TYPE REF TO cls1.
CREATE OBJECT obj1.
CALL METHOD obj1->m_cls1.
The output is as following:
1. cls1 can use all protected and private components of cls2.
2. cls1 can instantiate cls2 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 cls2 which is a private friend class of cls1. Now we have defined protected data and private data in class cls2. We also have defined a private method m_cls2 here. The method m_cls2 displays the protected and private data.
Now we have a public method m_cls1 of class cls1. In the implementation of m_cls1 we have instantiated friend class and called method m_cls2. 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 cls1 and called the method m_cls1. Hence we don't have to instantiate the friend class again as it has been instantiated before.
*&---------------------------------------------------------------------*
*& Report ZSR_TEST
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zsr_test.
*----------------------------------------------------------------------*
* CLASS cls1 DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cls1 DEFINITION.
PUBLIC SECTION.
METHODS m_cls1.
ENDCLASS. "cls1 DEFINITION
*----------------------------------------------------------------------*
* CLASS cls2 DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cls2 DEFINITION CREATE PRIVATE FRIENDS cls1.
PROTECTED SECTION.
DATA v_pro TYPE char50.
PRIVATE SECTION.
DATA v_txt TYPE char50.
METHODS m_cls2.
ENDCLASS. "cls2 DEFINITION
*----------------------------------------------------------------------*
* CLASS cls1 IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cls1 IMPLEMENTATION.
METHOD m_cls1.
DATA obj2 TYPE REF TO cls2.
CREATE OBJECT obj2.
CALL METHOD obj2->m_cls2.
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_cls1
ENDCLASS. "cls1 IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS cls2 IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cls2 IMPLEMENTATION.
METHOD m_cls2.
v_pro = 'Protected Data of Friend Class'.
v_txt = 'Private Data of Friend Class'.
WRITE: / 'Private Method:',
/ v_pro,
/ v_txt.
SKIP.
ENDMETHOD. "m_cls2
ENDCLASS. "cls2 IMPLEMENTATION
START-OF-SELECTION.
DATA obj1 TYPE REF TO cls1.
CREATE OBJECT obj1.
CALL METHOD obj1->m_cls1.
The output is as following:
Below is another version of the previous program and that will produce the same output. Here Definition Deferred has been used for defining cls1 class. The logic is same and we can use this procedure also. Here we have defined the friend class in another way like CLASS cls2 DEFINITION FRIENDS cls1.
*&---------------------------------------------------------------------*
*& Report ZSR_TEST
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zsr_test.
CLASS cls1 DEFINITION DEFERRED.
*----------------------------------------------------------------------*
* CLASS cls2 DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cls2 DEFINITION FRIENDS cls1.
PROTECTED SECTION.
DATA v_pro TYPE char50.
PRIVATE SECTION.
DATA v_txt TYPE char50.
METHODS m_cls2.
ENDCLASS. "cls2 DEFINITION
*----------------------------------------------------------------------*
* CLASS cls2 IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cls2 IMPLEMENTATION.
METHOD m_cls2.
v_pro = 'Protected Data of Friend Class'.
v_txt = 'Private Data of Friend Class'.
WRITE: / 'Private Method:',
/ v_pro,
/ v_txt.
SKIP.
ENDMETHOD. "m_cls2
ENDCLASS. "cls2 IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS cls1 DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cls1 DEFINITION.
PUBLIC SECTION.
METHODS m_cls1.
ENDCLASS. "cls1 DEFINITION
*----------------------------------------------------------------------*
* CLASS cls1 IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cls1 IMPLEMENTATION.
METHOD m_cls1.
DATA obj2 TYPE REF TO cls2.
CREATE OBJECT obj2.
CALL METHOD obj2->m_cls2.
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_cls1
ENDCLASS. "cls1 IMPLEMENTATION
START-OF-SELECTION.
DATA obj1 TYPE REF TO cls1.
CREATE OBJECT obj1.
CALL METHOD obj1->m_cls1.