‎2007 Dec 05 10:41 AM
Hi all,
I have a standard class C1 e two custom class Z1 and Z2 with the follow hierarchy scheme:
Z2 derived from Z1 derived from C1.
If I was in a Z2 method, can i call directly a C1 method?
Best regards,
Raffaele
‎2007 Dec 05 1:02 PM
Yes, you can.
It's fundamental that the C1 method is declared at least as Protected (or Public), which make the method visible to all subclasses.
Hope this helps,
R.
Ciao!
‎2007 Dec 05 1:47 PM
Sorry, but can you write me an example for the syntax of the call?
Grazie
Raffaele
‎2007 Dec 05 2:06 PM
Copy and Paste this:
REPORT yrobscratch.
*---------------------------------------------------------------------*
* CLASS c1 DEFINITION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS c1 DEFINITION.
PUBLIC SECTION.
METHODS: m1.
PROTECTED SECTION.
METHODS: m2.
ENDCLASS. "c1 DEFINITION
*---------------------------------------------------------------------*
* CLASS c2 INHERITING FRO
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS c2 DEFINITION INHERITING FROM c1.
PUBLIC SECTION.
METHODS: m3.
PRIVATE SECTION.
METHODS: m4.
ENDCLASS. "c2 INHERITING FRO
*---------------------------------------------------------------------*
* CLASS z1 INHERITING FRO
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS z1 DEFINITION INHERITING FROM c2.
PUBLIC SECTION.
METHODS: call_m2.
ENDCLASS. "z1 INHERITING FRO
*---------------------------------------------------------------------*
* CLASS c1 IMPLEMENTATION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS c1 IMPLEMENTATION.
METHOD m1.
WRITE: /'Metodo M1 - Classe C1 - Pubblico'.
ENDMETHOD. "m1
METHOD m2.
WRITE: /'Metodo M2 - Classe C1 - Protetto'.
ENDMETHOD. "m2
ENDCLASS. "c1 IMPLEMENTATION
*---------------------------------------------------------------------*
* CLASS c2 IMPLEMENTATION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS c2 IMPLEMENTATION.
METHOD m3.
WRITE: /'Metodo M3 - Classe C2 - Pubblico'.
ENDMETHOD. "m3
METHOD m4.
WRITE: /'Metodo M4 - Classe C2 - Privato'.
ENDMETHOD. "m4
ENDCLASS. "c2 IMPLEMENTATION
*---------------------------------------------------------------------*
* CLASS z1 IMPLEMENTATION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS z1 IMPLEMENTATION.
METHOD call_m2.
WRITE: 'Metodo call_M2 - Classe Z1 - Pubblico - Chiamo il metodo M2 di C1:'.
me->m2( ).
ENDMETHOD. "call_m2
ENDCLASS. "z1 IMPLEMENTATION
START-OF-SELECTION.
DATA: theClass TYPE REF TO z1.
CREATE OBJECT theClass.
theClass->call_m2( ).
You see that call_M2 method doesn't call a Public method of C1, but a Protected, as I was saying before.
Inside classes you can play with method calls, it will show you the inheritance principle!
Hope this helps,
R.
‎2007 Dec 05 2:38 PM
Sorry,
but I think I don't explain my problem very well:
I have Z2 derived from Z1 derived from C1.
Now I have a method m1 in C1 which was ridefined in Z1 and ridefined more in Z2.
I'm writing in Z2->m1 method: If Iwant to call the Z1->m1 method, I write the follow instruction:
CALL METHOD super->m1. " -
I can do this without any problem.
But If I want to call the C1->m1 method, what is the instruction I have to write, inside Z2->m1?
I hope I explain better, now.
Best Regards
Raffaele.
‎2007 Dec 05 3:23 PM
‎2007 Dec 05 5:08 PM
I think, but I can go wrong, that this simply not possibile until you define a service method that re-distributes the call.
As abap documentation says, ABAP takes over the principle of single inheritance. This means that a subclass can only have ONE superclass.
You can only re-distribute the call, like this:
*---------------------------------------------------------------------*
* CLASS c1 DEFINITION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS c1 DEFINITION.
PUBLIC SECTION.
METHODS: m1.
PROTECTED SECTION.
METHODS: m2.
ENDCLASS. "c1 DEFINITION
*---------------------------------------------------------------------*
* CLASS c2 INHERITING FRO
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS c2 DEFINITION INHERITING FROM c1.
PUBLIC SECTION.
METHODS: m1 REDEFINITION.
METHODS: m3.
PRIVATE SECTION.
METHODS: m4.
ENDCLASS. "c2 INHERITING FRO
*---------------------------------------------------------------------*
* CLASS z1 INHERITING FRO
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS z1 DEFINITION INHERITING FROM c2.
PUBLIC SECTION.
METHODS: m1 REDEFINITION.
METHODS: call_m2.
ENDCLASS. "z1 INHERITING FRO
*---------------------------------------------------------------------*
* CLASS c1 IMPLEMENTATION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS c1 IMPLEMENTATION.
METHOD m1.
WRITE: /'Metodo M1 - Classe C1 - Pubblico'.
ENDMETHOD. "m1
METHOD m2.
WRITE: /'Metodo M2 - Classe C1 - Protetto'.
ENDMETHOD. "m2
ENDCLASS. "c1 IMPLEMENTATION
*---------------------------------------------------------------------*
* CLASS c2 IMPLEMENTATION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS c2 IMPLEMENTATION.
METHOD m1.
WRITE: /'Metodo C2->M1 - Ridefinizione di C1->M1'.
* // Calls C1->M1.
super->m1( ).
ENDMETHOD. "m1
METHOD m3.
WRITE: /'Metodo M3 - Classe C2 - Pubblico'.
ENDMETHOD. "m3
METHOD m4.
WRITE: /'Metodo M4 - Classe C2 - Privato'.
ENDMETHOD. "m4
ENDCLASS. "c2 IMPLEMENTATION
*---------------------------------------------------------------------*
* CLASS z1 IMPLEMENTATION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS z1 IMPLEMENTATION.
METHOD m1.
WRITE: /'Metodo Z1->M1 - Ridefinizione di C2->M1'.
* // Calls C2->M1
super->m1( ).
ENDMETHOD. "m1
METHOD call_m2.
WRITE: 'Metodo call_M2 - Classe Z1 - Pubblico - Chiamo il metodo M2 di C1:'.
me->m2( ).
ENDMETHOD. "call_m2
ENDCLASS. "z1 IMPLEMENTATION
START-OF-SELECTION.
DATA: theclass TYPE REF TO z1.
CREATE OBJECT theclass.
WRITE 'Stack Chiamate'.
theclass->m1( ).
But you cannot call directly the super.super->m1( ).
However, I'm still investigating!
‎2007 Dec 05 5:13 PM
Ok thank you very much Roberto,
but I need just the syntax for super.super->m1().
1000 Grazie per la disponibilità comunque!
‎2007 Dec 05 5:56 PM