Inhiterance:未知下游异常。从子目录访问私有属性

2020-08-19 08:32发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好,

我需要你的帮助。

许多示例表明,我可以创建一个继承自超类的子类,添加方法和属性,并进行如下操作:?= ,然后调用该子类的方法(即 能够访问以保护超类实例的数据)。

但是,当我尝试对从cl_gui_alv_grid派生的类进行相同操作时,我总是在向下转换的指令中出现强制类型转换异常。

示例:


 字段符号:类型标准表。
 数据:gos_alv类型为cl_gui_alv_grid的引用。

 * -------------------------------------------------  -------------------- *
 * CLASS lcl_gui_alv_grid定义
 * -------------------------------------------------  -------------------- *
 *
 * -------------------------------------------------  -------------------- *
 从cl_gui_alv_grid继承的class lcl_gui_alv_grid定义。
   公共部分。
     方法:get_tab_line。
 结束类。  " lcl_gui_alv_grid定义
 
 * -------------------------------------------------  -------------------- *
 * CLASS lcl_gui_alv_grid实施
 * -------------------------------------------------  -------------------- *
 *
 * -------------------------------------------------  -------------------- *
 lcl_gui_alv_grid类的实现。
   方法get_tab_line。
 * mt_outtab是作为受保护属性保存的数据表
 *在cl_gui_alv_grid类中。
     将我-> mt_outtab-> *分配给。  "原始数据
   方法。  " get_tab_line
 结束类。  " lcl_gui_alv_grid IMPLEMENTATION
 
 数据:l_alv类型引用到lcl_gui_alv_grid。
 

但是当我像这样进行垂头丧气时(gos_alv已经使用"创建对象"指令创建了):

 l_alv?= gos_alv。
 

我有一个转换错误的例外。 我不明白为什么以及如何解决问题。

非常感谢您的协作。

安德里亚

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好,

我需要你的帮助。

许多示例表明,我可以创建一个继承自超类的子类,添加方法和属性,并进行如下操作:?= ,然后调用该子类的方法(即 能够访问以保护超类实例的数据)。

但是,当我尝试对从cl_gui_alv_grid派生的类进行相同操作时,我总是在向下转换的指令中出现强制类型转换异常。

示例:


 字段符号:类型标准表。
 数据:gos_alv类型为cl_gui_alv_grid的引用。

 * -------------------------------------------------  -------------------- *
 * CLASS lcl_gui_alv_grid定义
 * -------------------------------------------------  -------------------- *
 *
 * -------------------------------------------------  -------------------- *
 从cl_gui_alv_grid继承的class lcl_gui_alv_grid定义。
   公共部分。
     方法:get_tab_line。
 结束类。  " lcl_gui_alv_grid定义
 
 * -------------------------------------------------  -------------------- *
 * CLASS lcl_gui_alv_grid实施
 * -------------------------------------------------  -------------------- *
 *
 * -------------------------------------------------  -------------------- *
 lcl_gui_alv_grid类的实现。
   方法get_tab_line。
 * mt_outtab是作为受保护属性保存的数据表
 *在cl_gui_alv_grid类中。
     将我-> mt_outtab-> *分配给。  "原始数据
   方法。  " get_tab_line
 结束类。  " lcl_gui_alv_grid IMPLEMENTATION
 
 数据:l_alv类型引用到lcl_gui_alv_grid。
 

但是当我像这样进行垂头丧气时(gos_alv已经使用"创建对象"指令创建了):

 l_alv?= gos_alv。
 

我有一个转换错误的例外。 我不明白为什么以及如何解决问题。

非常感谢您的协作。

安德里亚

付费偷看设置
发送
2条回答
Haoba3210
1楼 · 2020-08-19 08:57.采纳回答

安德里亚,你好

我建议您微调代码,因为我想重点是获取mt_outtab表,对吧?

 CLASS lcl_gui_alv_grid从cl_gui_alv_grid继承。
   公共部分。
     类别方法get_tab_line导入o_alv类型参考cl_gui_alv_grid。  "声明方法为静态方法
 ENDCLASS。

 类别lcl_gui_alv_grid实施。
   方法get_tab_line。
     字段符号类型标准表。
     将我-> mt_outtab-> *分配给。
     "您想要的编码在这里
   终结法。
 ENDCLASS。
 

现在您需要做的就是调用静态方法get_tab_line提供您的实际Alv参考

 数据:gos_alv类型为cl_gui_alv_grid的引用。

 创建对象gos_alv ....

 lcl_gui_alv_grid => get_tab_line(gos_alv)。
 

关于您的问题,为什么使用此代码

 l_alv?= gos_alv。
 

触发异常 cx_sy_move_cast_error 。

如果您使用此编码

   尝试。
       l_alv?= gos_alv。
     抓住。
       cx_sy_move_cast_error
 "系统将在这里结束
   ENDTRY。
 

...您可以防止系统转储,但是无论如何都会触发异常。 您会抓住它的。

问题仅源于这样的事实,即下注检查将这两个参考变量 l_alv 和 gos_alv 置于同一级别。 这就是为什么你在那放问号? 询问系统gos_alv实际上是否包含适当的参考。 您只能在程序执行期间对其进行评估。

当涉及到铸件时,总是会想到这种情况。

您拥有VEHICLE类(您的 cl_gui_alv_grid )。 从其继承的类是PLANE(您的lcl_gui_alv_grid)。 现在,您随时可以进行这样的操作

 车辆=飞机(cl_gui_alv_grid = lcl_gui_alv_grid)"上投-窄投
 

但是你永远做不到

 平面=车辆(lcl_gui_alv_grid = cl_gui_alv_grid)"
 

这是因为飞机始终是交通工具,但交通工具不必是平原。 它可以是卡车,轮船或飞机。

因此,对于下降演员,您总是必须询问系统VEHICLE是否确实包含(在执行过程中)对PLANE的引用。 这就是为什么你这样写

 飞机?=车辆(lcl_gui_alv_grid?= cl_gui_alv_grid)
 

然后系统检查车辆是否真的在其中包含平面参考。

以为乍看之下可能没有用,这是政治化的基础,但这是另一次谈话;)

致谢

Marcin

zhangjiyang1323
2楼-- · 2020-08-19 08:58

如果Down Cast总是给出Move data Exception,那么Down Case的实时用途是什么??


可以使用'='运算符直接在层次结构或更高版本的情况下将对象投射到同一级别。

一周热门 更多>