访问超类的成员函数

时间:2016-08-02 09:59:26

标签: class inheritance abap

如何访问超级班级'来自儿童班的方法'方法吗

这是一个说明问题的示例: 可以说,我们有两个班级

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是一个应该触发弹出窗口的事件处理程序。当弹出窗口以对child的调用形式关闭时,g会收到回调。如果调用g,则应调用原始实现parent->f

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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( ).