2016-08-02 73 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(). 
相关问题