2016-08-02 117 views
4

如何從子類的方法訪問超類的方法?訪問超類的成員函數

這裏是一個能說明問題的例子: 比方說,我們有兩個班

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

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

現在,在g實現中,我們要調用超類的實現的f相似以下語法錯誤的片段

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

正如評論指出,這是不可能使用super->。你能幫我嗎?


一些google搜索後,有人建議的parent->f執行復制到child->g這是真的做到這一點的唯一途徑?


實際使用情況

@vwegert問爲什麼f首先被重新定義。在我的真實使用案例中,parent是一個視圖,而child是它的擴展。 child->f是一個應該觸發彈出窗口的事件處理程序。 child當彈出窗口以g的呼叫形式關閉時收到回叫。如果調用g,則應調用原始實現parent->f

+0

爲什麼你首先重新定義方法......? – vwegert

+1

@vwegert我已經將實際用例添加到問題中,但我相信,一般問題也應該得到答案。 – niklasfi

回答

1

你將不得不訴諸一些比較難看的解決辦法 - 像g設置標誌(對象的屬性),然後調用重新定義f,檢查是否設置了標誌,如果是這樣,只能調用super->f。這聽起來像是一個非常破碎的設計,但。你不會詳述,但我認爲你無法改變父視圖 - 否則我強烈建議重新考慮設計,因爲這會導致不必要的複雜性和技術債務,這很可能會引入錯誤並增加維護成本。

+0

@vwgert這確實是我想出的解決方案。我將把這個問題留給更多的時間,希望能有更好的解決方案。否則我會最終接受它。 – niklasfi

0

如果您不介意在父類中創建受保護的方法do_f,然後將控件從f方法委託給do_f方法。那麼下面的解決方案可能是相當整潔的。沒有代碼重複,只需要在「原始」f方法中委託調用的一些額外工作。

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().