ABAP程序中的铸造

a1 类定义。
 公共部分。
 数据:num1 类型 i 值 100。
 方法:m1。
 结束。
 a1 类实施。
 方法 m1。
 写:'a1:',num1。
 结束方法。
 结束。
 继承自 a1 的 b1 类定义。
 公共部分。
 方法:m2、m1 重新定义。
 结束。
 b1 类实施。
 方法 m1。
 数字 1 = 数字 1。
 写:'b1:',num1。
 结束方法。
 方法 m2。
 写:“B2 类中的 M1”。
 结束方法。
 结束。
 开始选择。
 数据:a1 的类型参考。
 数据: b 类型参考 b1。
 *数据:c 类型 REF TO c1。
 ****************************************************** ************** 创建对象 b。
 a = b。  "向上转换调用方法 a->m1( )。
 *调用方法 a->m2( )。  “我们不能使用超类引用访问自己的子类方法。
 新队。
 b ?= a。  " 向下转换调用方法 b->m1( )。
 新队。
 调用方法 b->m2( )。
 ****************************************************** ****************** "错误 null ref create OBJECT a.
 b ?= a。  “向下铸造仍然是它给出的转储调用方法 b->m1()。
 ****************************************************** ****************** 创建对象
 尝试。
 b ?= a。  “你试图使用‘NULL’对象引用转储 CATCH cx_sy_move_cast_error。
 调用方法 b->m1( )。
 结束。
 ****************************************************** ****************** 创建对象
 创建对象 b.
 尝试。
 b ?= a。
 捕获 cx_sy_move_cast_error。
 调用方法 b->m1( )。
 调用方法 b->m2( )。
 结束。
 类 lcl_shape 定义。
 公共部分。
 方法绘制。
 结束。
 从 lcl_shape 继承的类 lcl_circle 定义。
 公共部分。
 方法:绘制重定义,计算面积。
 结束。
 类 lcl_shape 实现。
 方法绘制。
 WRITE :/ '绘制任何形状'。
 结束方法。
 结束。
 类 lcl_circle 实现。
 方法绘制。
 WRITE :/ '绘制特定形状:圆形'。
 结束方法。
 方法 calc_area。
 写:/'Crcle 面积 = 2iiR'。
 结束方法。
 结束。
 开始选择。
 数据:o_cir 类型参考 lcl_circle。
 创建对象o_cir。
 调用方法 o_cir->draw()。  " 调用子类 Draw() 方法 CALL METHOD o_cir->calc_area( )。
 线。
 “--------- 窄投射(Upcast)---------------” 数据:o_shp 类型参考到 lcl_shape。
 o_shp = o_cir。  " 窄投射(Upcast)调用方法 o_shp->draw( )。  “调用子类 Draw() 方法”调用 METHOD o_shp->calc_area()。  " 编译错误 ULINE.
 “--------- 加宽投射(向下投射)-----------” 数据:o_cir1 类型参考到 lcl_circle。
 " o_cir1 = o_shp。  " 编译错误 o_cir1 ?= o_shp.  " 加宽投射(向下投射)调用方法 o_cir1->draw( )。  " 调用子类 Draw() 方法 CALL METHOD o_cir1->calc_area( )。
 a1 类定义。
 公共部分。
 数据:num1 类型 i 值 100。
 方法:m1。
 结束。
 a1 类实施。
 方法 m1。
 写:'a1:',num1。
 结束方法。
 结束。
 继承自 a1 的 b1 类定义。
 公共部分。
 方法:m2、m1 重新定义。
 结束。
 b1 类实施。
 方法 m1。
 数字 1 = 数字 1。
 写:'b1:',num1。
 结束方法。
 方法 m2。
 写:“B2 类中的 M1”。
 结束方法。
 结束。
 开始选择。
 数据:父类型参考 a1。
 数据:子 TYPE REF TO b1。
 *数据:c 类型 REF TO c1。
 ****************************************************** ************** 创建对象的孩子。
 父母=孩子。  “向上转换 CALL METHOD 父级->m1( )。
 调用方法 child->m1( )。
 调用方法 child->m2( )。
 *调用方法 a->m2( )。  “我们不能使用超类引用访问自己的子类方法。
 新队。
 孩子?=父母。  " 向下转换 CALL METHOD child->m1( )。
 新队。
 调用方法 child->m2( )。
 ****************************************************** **************** *" error null ref *create OBJECT a.
 *b ?= 一个。  “向下铸造仍然是它的转储 *call METHOD b->m1( )。
 ****************************************************** ****************** * 创建对象
 尝试。
 b ?= a。  “你试图使用‘NULL’对象引用转储 CATCH cx_sy_move_cast_error。
 调用方法 b->m1( )。
 结束。
 ****************************************************** ****************** * 创建对象
 创建对象 b.
 尝试。
 b ?= a。
 捕获 cx_sy_move_cast_error。
 调用方法 b->m1( )。
 调用方法 b->m2( )。
 结束。
 ******** 唯一值****************** 数据:lv_string TYPE 字符串,lv_string2 TYPE 字符串,lv_string_final TYPE 字符串。
 类型:ty_data 开始,身份验证类型 c,ty_data 结束。
 数据:ls_user TYPE ty_data、ls_user2 TYPE ty_data、lt_user2 TYPE TABLE OF ty_data、lt_user TYPE TABLE OF ty_data。
 lv_string = 'a,b,c,a'。
 lv_string2 = 'd,b,c,a'。
 拆分 lv_string AT ',' INTO TABLE lt_user。
 将 lv_string2 AT ',' 拆分为表 lt_user2。
 在 lt_user2 处循环分配字段符号( )。
 插入进入表 lt_user。
 ENDLOOP。
 通过身份验证对 lt_user 进行排序。
 从 lt_user 比较身份验证中删除相邻的重复项。
 如果 sy-subrc = 0。
 在 lt_user 循环分配字段符号( )。
 如果 lv_string_final 是初始值。
 lv_string_final = -认证。
 别的。
 连接 lv_string_final -auth INTO lv_string_final 由','分隔。
 万一。
 ENDLOOP。
 万一。

 

发表评论

本网站使用Akismet来减少垃圾邮件。 了解您的数据如何处理.