2016-08-02 29 views
4

Wie kann ich auf eine Superklassenmethode aus einer Kindklassenmethode zugreifen? HierZugriff auf Elementfunktion der Superklasse

ist ein Beispiel, das das Problem veranschaulicht: Lassen Sie uns sagen, wir haben zwei Klassen

class parent definition. 
public section. 
    methods f. 
endclass. 

class child definition inheriting from parent. 
public section. 
    methods f redefinition. 
    methods g. 
endclass. 

nun bei der Umsetzung von g wir die Super-Klasse Implementierung von f ähnlich der anzurufenden folgende syntaktisch falsch Schnipsel

class child implementation. 
    method g. 
    super->f(). "forbidden: super-> can only be used to call the previous implementation of the same method 
    endmethod. 
endclass. 

Wie im Kommentar erwähnt, ist es nicht möglich, super-> zu verwenden. Kannst du helfen?


Nach einigen googeln, wurde vorgeschlagen, die Umsetzung der parent->f in child->g ist dies wirklich der einzige Weg, es zu tun zu kopieren?


Die eigentliche Anwendungsfall

@vwegert gefragt, warum f in erster Linie neu definiert wird. In meinem realen Anwendungsfall ist parent eine Ansicht und child seine Erweiterung. child->f ist ein Event-Handler, der ein Popup auslösen soll. child empfängt einen Rückruf, wenn das Popup in Form eines Aufrufs an g geschlossen wird. Wenn g aufgerufen wird, sollte die ursprüngliche Implementierung parent->f aufgerufen werden.

+0

Warum definieren Sie die Methode an erster Stelle ...? – vwegert

+1

@vwegert Ich habe der Frage den tatsächlichen Anwendungsfall hinzugefügt, aber ich glaube, dass die allgemeine Frage auch eine Antwort verdient. – niklasfi

Antwort

1

Sie werden zu einem gewissen ziemlich hässlich Abhilfe zurückgreifen - wie ein Flag gesetzt (Attribut des Objekts) in g, dann die f neu definiert rufen, prüfen Sie, ob das Flag gesetzt ist, und wenn es nur super->f nennen. Es klingt jedoch nach einem sehr kaputten Design. Sie gehen nicht ins Detail, aber ich nehme an, Sie sind nicht in der Lage, die Elternansicht zu ändern - sonst würde ich dringend vorschlagen, das Design zu überdenken, weil dies zu unnötiger Komplexität und technischen Schulden führen wird, die sehr wahrscheinlich Fehler einführen wird und erhöhen die Wartungskosten.

+0

@vwgert das ist in der Tat die Lösung, die ich mir ausgedacht habe. Ich lasse diese Frage noch einige Zeit offen und hoffe auf eine bessere Lösung. Ich werde es schließlich anders annehmen. – niklasfi

0

Wenn es Ihnen nichts ausmacht, eine geschützte Methode do_f in der Elternklasse zu erstellen und dann das Steuerelement von f Methode zu do_f Methode darin zu delegieren. Dann könnte die folgende Lösung recht ordentlich sein. Keine Code-Duplizierung, nur einige zusätzliche Arbeit bei der Delegierung des Aufrufs in der "Original" f Methode.

REPORT zzy. 

CLASS parent DEFINITION. 
    PUBLIC SECTION. 
    METHODS f. 
    PROTECTED SECTION. 
    METHODS do_f. 
ENDCLASS. 

CLASS parent IMPLEMENTATION. 
    METHOD f. 
    do_f(). 
    ENDMETHOD. 

    METHOD do_f. 
    WRITE/'Parent''s f'. 
    ENDMETHOD. 
ENDCLASS. 

CLASS child DEFINITION INHERITING FROM parent. 
    PUBLIC SECTION. 
    METHODS: 
     f REDEFINITION, 
     g. 
ENDCLASS. 

CLASS child IMPLEMENTATION. 
    METHOD f. 
    WRITE/'Child''s f'. 
    ENDMETHOD. 

    METHOD g. 
    do_f(). 
    ENDMETHOD. 
ENDCLASS. 

START-OF-SELECTION. 
    DATA(lo_child) = NEW child(). 
    lo_child->g(). 
    lo_child->f().