首先个人理解这个“?”和指针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
**调试过很多次,感觉?=和=的用法在面向对象中差不多,不过?=是专门用于引用类型的,有兴趣的可以自行调试,
往后再有此符号的不同用法我会再更新。**