Application Development and Automation Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

Class hierarchy

Former Member
0 Likes
975

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

8 REPLIES 8
Read only

former_member199581
Active Participant
0 Likes
913

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!

Read only

Former Member
0 Likes
913

Sorry, but can you write me an example for the syntax of the call?

Grazie

Raffaele

Read only

0 Likes
913

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.

Read only

Former Member
0 Likes
913

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.

Read only

0 Likes
913

...mmm let me try this and I'll say you something!

Read only

0 Likes
913

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!

Read only

Former Member
0 Likes
913

Ok thank you very much Roberto,

but I need just the syntax for super.super->m1().

1000 Grazie per la disponibilità comunque!

Read only

0 Likes
913

No problem!

Se trovo qualcosa, ti faccio sapere!