2007 Feb 03 11:14 AM
hi all,
i read the book written by dr horst keller and sascha kruger "abap objects" with confusion on the below script. really hope can get the help.
1) confused 1, why creator has no create object and only create reference variable? why no need to create instance of client class?
2) confused 2. why only me? me means everything(attribute/method) of client class? why not define as me->name just like in confused 4?
3) why creator no create object also can creator->name?
report self_reference.
class client definition.
public section.
data name(10) type c value 'master' read-only.
methods create_server.
endclass.
class server definition.
public section.
methods acknowledge importing creator type ref to client. "confused 1
private section.
data name(10) type c value 'servant'.
endclass.
class client implementation.
method create_server.
data server_ref type ref to server.
create object server_ref.
call method server_ref->acknowledge exporting creator = me. "confused 2
endmethod.
endclass.
class server implementation.
method acknowledge.
data name type string.
name = creator->name. "confused 3
write: me->name, 'created by', name. "confused 4
endmethod.
endclass.
data client_ref type ref to client.
start-of-selection.
create object client_ref.
call method client_ref->create_server
the output is "servant created by master".
hi all,
i read the book written by dr horst keller and sascha kruger "abap objects" with confusion on the below script. really hope can get the help.
1) confused 1, why creator has no create object and only create reference variable? why no need to create instance of client class?
2) confused 2. why only me? me means everything(attribute/method) of client class? why not define as me->name just like in confused 4?
3) why creator no create object also can creator->name?
report self_reference.
class client definition.
public section.
data name(10) type c value 'master' read-only.
methods create_server.
endclass.
class server definition.
public section.
methods acknowledge importing creator type ref to client. "confused 1
private section.
data name(10) type c value 'servant'.
endclass.
class client implementation.
method create_server.
data server_ref type ref to server.
create object server_ref.
call method server_ref->acknowledge exporting creator = me. "confused 2
endmethod.
endclass.
class server implementation.
method acknowledge.
data name type string.
name = creator->name. "confused 3
write: me->name, 'created by', name. "confused 4
endmethod.
endclass.
data client_ref type ref to client.
start-of-selection.
create object client_ref.
call method client_ref->create_server
the output is "servant created by master".
2007 Feb 04 8:08 PM
Hello
I have added some comments to the coding which hopefully clarify your questions.
*&---------------------------------------------------------------------*
*& Report ZUS_SDN_OO_CLIENT_SERVER
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zus_sdn_oo_client_server.
*report self_reference.
CLASS client DEFINITION.
PUBLIC SECTION.
DATA name(10) TYPE c VALUE 'master' READ-ONLY.
METHODS create_server.
ENDCLASS. "client DEFINITION
*---------------------------------------------------------------------*
* CLASS server DEFINITION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS server DEFINITION.
PUBLIC SECTION.
METHODS acknowledge
IMPORTING
creator TYPE REF TO client. "confused 1
PRIVATE SECTION.
DATA name(10) TYPE c VALUE 'servant'.
ENDCLASS. "server DEFINITION
*---------------------------------------------------------------------*
* CLASS client IMPLEMENTATION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS client IMPLEMENTATION.
METHOD create_server.
DATA server_ref TYPE REF TO server.
CREATE OBJECT server_ref.
CALL METHOD server_ref->acknowledge
EXPORTING
creator = me. "confused 2
* NOTE: me == instance created with CREATE OBJECT client_ref.
* We are now WITHIN this instance and, therefore, can refer
* to it using ME (NOTE: in Java we use THIS).
ENDMETHOD. "create_server
ENDCLASS. "client IMPLEMENTATION
*---------------------------------------------------------------------*
* CLASS server IMPLEMENTATION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS server IMPLEMENTATION.
METHOD acknowledge.
DATA name TYPE string.
* NOTE: creator has been imported into this method. Creator is
* the previously created instance of client. Because we are
* now in the server class ME does refer to the server instance and
* not the client instance.
name = creator->name. "confused 3
* NOTE: this is bad programming because the class has a private
* instance attribute NAME and this method a local variable
* of the same name.
* The instance attribute me->name has the predefined value
* 'servant' whereas the local variable now has the value 'master'
* corresponding to the NAME attribute of the client class
*
* NOTE: here ME represents the server instance because we are
* within a server class method.
WRITE: me->name, 'created by', name. "confused 4
ENDMETHOD. "acknowledge
ENDCLASS. "server IMPLEMENTATION
DATA client_ref TYPE REF TO client.
START-OF-SELECTION.
* NOTE: every class has a CONSTRUCTOR method, either explicitly
* defined or it is IMPLICITLY called (like in this case).
CREATE OBJECT client_ref.
WRITE: / client_ref->name. " public attribute -> accessible here
SKIP.
CALL METHOD client_ref->create_server.Regards
Uwe