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
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
| User | Count |
|---|---|
| 6 | |
| 2 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 |