Redefinierte Methoden?

Heute habe ich in einer Klassenhierarchie (Superklasse -> vererbte Klassen) eine Klasse gesucht habe, bei der ich eine bestimmte Methode redefiniert habe.

Als anständiger Programmierer war ich natürlich zu faul, mich auch nur durch drei vererbte Klassen durchzuklicken… Also bin ich auf die Suche nach einem passenden Funktionsbaustein gegangen und dabei auf SEO_INHERITANC_READ gestossen. Diesem Funktionsbaustein kannst du eine Klasse übergeben und erhältst alle redefinierten Methoden.

Nicht ganz das, was ich gesucht habe, aber die verwendete Tabelle SEOREDEF lieferte mir die gewünschten Informationen im Handumdrehen.

Hier ein Beispiel in dem du siehst, welche Methoden von CL_GUI_CONTAINER in direkt geerbten Klassen redefiniert wurden:

2015-11-09_18-17-16

Allerdings ist diese Methode nicht 100%ig, denn es wird natürlich nur die direkte Vererbung gespeichert. Von der Klasse CL_GUI_DOCKING_CONTAINER zum Beispiel erben weitere Klassen. Deren Redefinitionen sind nur sichtbar, wenn du die Klasse CL_GUI_DOCKING_CONTAINER direkt eingibst.

Um zu sehen, wo entlang einer Vererbungshierarchie welche Methoden redefiniert wurden, muss also noch ein Programm geschrieben werden.

Programm

Hier ist das kleine Programm. Quick and dirty. Methode GET_SUBCLASSES der Klasse CL_OO_CLASS gibt alle vererbten Klassen zurück.

von diesen Klassen werden die redefinierten Methoden ermittelt.

Um zu sehen, welche Methode in welcher Klasse redefiniert wurde, muss nach Methode gefiltert oder sortiert werden:

2015-11-09_18-49-58

Code

REPORT.

PARAMETERS p_class TYPE seoclsname DEFAULT 'CL_GUI_CONTAINER'.

DATA gt_redef TYPE STANDARD TABLE OF seoredef.

START-OF-SELECTION.

 PERFORM do USING p_class 'X'.
 PERFORM display.

*&---------------------------------------------------------------------*
*& Form display
*&---------------------------------------------------------------------*
FORM display.

 DATA lr_table TYPE REF TO cl_salv_table.
 DATA lr_funcs TYPE REF TO cl_salv_functions_list.

 CALL METHOD cl_salv_table=>factory
 IMPORTING
 r_salv_table = lr_table
 CHANGING
 t_table = gt_redef.

 lr_funcs = lr_table->get_functions( ).
 lr_funcs->set_all( ).

 lr_table->display( ).
ENDFORM. "display


*&---------------------------------------------------------------------*
*& Form do
*&---------------------------------------------------------------------*
FORM do USING i_class TYPE seoclsname
 i_start TYPE boolean.

 DATA lr_class TYPE REF TO cl_oo_class.
 DATA lt_subclasses TYPE seo_relkeys.
 DATA ls_subclass LIKE LINE OF lt_subclasses.

 TRY .
 lr_class ?= cl_oo_class=>get_instance( i_class ).

 APPEND LINES OF lr_class->redefinitions TO gt_redef.
 lt_subclasses = lr_class->get_subclasses( ).

 IF i_start = abap_true.
 LOOP AT lt_subclasses INTO ls_subclass.
 PERFORM do USING ls_subclass-clsname space.
 ENDLOOP.
 ENDIF.

 CATCH cx_class_not_existent.

 ENDTRY.

ENDFORM. "do


                         
Enno Wulff