访问超级类的成员函数



如何从子类方法访问超类方法

以下是一个说明问题的示例:比方说,我们有两个类

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->。你能帮忙吗?


经过一些谷歌搜索,有人建议将parent->f的实现复制到child->g中,这真的是唯一的方法吗?


实际用例

@vwegert首先问为什么f被重新定义。在我的真实用例中,parent是一个视图,child是它的扩展。child->f是一个事件处理程序,它应该触发一个弹出窗口。当弹出窗口以调用g的形式关闭时,child接收回调。如果调用了g,则应该调用原始实现parent->f

您将不得不求助于一些相当丑陋的解决方法,比如在g中设置一个标志(对象的属性),然后调用重新定义的f,检查标志是否已设置,如果已设置,则只调用super->f。不过,这听起来像是一个非常破碎的设计。您不需要详细说明,但我认为您无法更改父视图,否则我强烈建议重新考虑设计,因为这将导致不必要的复杂性和技术债务,很可能会引入错误并增加维护成本。

如果您不介意在父类中创建一个受保护的方法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( ).

相关内容

  • 没有找到相关文章

最新更新