访问super的成员函数class
Accessing member function of super class
如何从子 class' 方法访问超级 class' 方法?
这是一个说明问题的例子:
比方说,我们有两个 classes
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' 实现,类似于以下语法错误的片段
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
。
你将不得不求助于一些相当丑陋的解决方法——比如在 g
中设置一个标志(对象的属性),然后调用重新定义的 f
,检查是否设置了标志并如果是,只调用 super->f
。不过,这听起来像是一个非常糟糕的设计。您没有详细说明,但我假设您无法更改父视图 - 否则我强烈建议重新考虑设计,因为这会导致不必要的复杂性和技术债务,很可能会引入错误并增加维护成本。
如果您不介意在父 class 中创建一个受保护的方法 do_f
,然后将控制权从 f
方法委托给其中的 do_f
方法。那么下面的解决方案可能是一个非常简洁的解决方案。没有代码重复,只是在 "original" 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( ).
如何从子 class' 方法访问超级 class' 方法?
这是一个说明问题的例子: 比方说,我们有两个 classes
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' 实现,类似于以下语法错误的片段
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
。
你将不得不求助于一些相当丑陋的解决方法——比如在 g
中设置一个标志(对象的属性),然后调用重新定义的 f
,检查是否设置了标志并如果是,只调用 super->f
。不过,这听起来像是一个非常糟糕的设计。您没有详细说明,但我假设您无法更改父视图 - 否则我强烈建议重新考虑设计,因为这会导致不必要的复杂性和技术债务,很可能会引入错误并增加维护成本。
如果您不介意在父 class 中创建一个受保护的方法 do_f
,然后将控制权从 f
方法委托给其中的 do_f
方法。那么下面的解决方案可能是一个非常简洁的解决方案。没有代码重复,只是在 "original" 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( ).