sap ABAP "?"和"?=" 的涵义(Casting)

首先个人理解这个“?”和指针Field Symbol里的Casting有着相同的意思。

所以,先来看这个Casting是什么。
Casting在英语词典有“铸造;铸件;投掷;角色分配;扔掉”的意思,那么在ABAP里可以这样理解Casting——“舍弃之前的自己,改造自己以适应新环境”。

而Catsing分为隐式型变化和显示型变化两种,下面看看Casting在Field Symbol中起的作用:

1.隐式变化:

ASSSIGN <var> TO <fs> CASTING.

例子:

TYPES: BEGIN OF t_line,
         col1 TYPE char5,
         col2 TYPE char10,
         col3 TYPE char15,
        END OF t_line.

DATA: gv_addr(30) TYPE c VALUE 'CHINA BEIJING TWIN BUILDING'.

FIELD-SYMBOLS: <fs> TYPE t_line.

ASSIGN gv_addr TO <fs> CASTING.

WRITE: <fs>-col1, <fs>-col2, <fs>-col3.

运行结果:

CHINA  BEIJING T WIN BUILDING

其中
<fs>-col1=CHINA, <fs>-col2= BEIJING T,<fs>-col3=WIN BUILDING

在这个例子中,若不使用Casting,则会产生数据类型不一致的错误,因为是结构类型,gv_addr是字符类型。

2.显式变化
若将上述例子中的FIELD SYMBOLS 定义为Generic Type(不指定类型)即
将:

FIELD-SYMBOLS: <fs> TYPE t_line.

改为:

FIELD-SYMBOLS: <fs> TYPE ANY.

ASSIGN gv_addr TO <fs> CASTING.

要改为

ASSIGN gv_addr TO <fs> CASTING TYPE t_line.

且输出语句不能再用

WRITE: <fs>-col1, <fs>-col2, <fs>-col3.

也得改成:

WRITE: <fs>.

而这个”?”即Casting符号,更多是用于面向对象的,意思是参照其它类的对象创建新对象。

**这个其他类指的是父类和从父类继承的子类,子类可重新定义,或追加父类的属性及方法。
从父类衍生的对象和子类衍生的对象类型可能不同,但此时可用casting符号“?”来使程序正常执行。**

例子:

*---------------------------------------------------------------------*
*       CLASS vehicle DEFINITION
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
CLASS vehicle DEFINITION INHERITING FROM object.
  PUBLIC SECTION.
    METHODS: create,
             drive.
  PROTECTED SECTION.
    DATA speed TYPE i VALUE '100'.
ENDCLASS.

*---------------------------------------------------------------------*
*       CLASS plane DEFINITION
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
CLASS plane DEFINITION INHERITING FROM vehicle.
  PUBLIC SECTION.
    METHODS: fly.
ENDCLASS.

*---------------------------------------------------------------------*
*       CLASS vehicle IMPLEMENTATION
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
CLASS vehicle IMPLEMENTATION.
  METHOD create.

  ENDMETHOD.

  METHOD drive.
    speed = speed + 100.
    WRITE: 'Driving is possible,','Current Speed:',speed.
  ENDMETHOD.
ENDCLASS.

*---------------------------------------------------------------------*
*       CLASS plane IMPLEMENTATION
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
CLASS plane IMPLEMENTATION.
  METHOD fly.
    speed = speed + 1000.
  ENDMETHOD.
ENDCLASS.

DATA : car TYPE REF TO vehicle,
       air TYPE REF TO vehicle.

START-OF-SELECTION.
  CREATE OBJECT : car.
  air ?= car.

  CALL METHOD: air->drive.

运行结果:

Driving is possible, Current Speed:        200

**调试过很多次,感觉?=和=的用法在面向对象中差不多,不过?=是专门用于引用类型的,有兴趣的可以自行调试,
往后再有此符号的不同用法我会再更新。**

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值