博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[OO]ABAP OO 语法--实例看 "="与"?=" 的区别[转]
阅读量:7156 次
发布时间:2019-06-29

本文共 7584 字,大约阅读时间需要 25 分钟。

ABAP OO 面向对象语法
   实例看  "=" 与 "?=" 的区别
  
                
1. "="  同类型赋值
*&---------------------------------------------------------------------*
*& Report  Z_WYS_TYPEREF01
*&作者:永上
*&---------------------------------------------------------------------*
*&同类之间用 = 赋值
*&
*&---------------------------------------------------------------------*
REPORT  z_wys_typeref01.
 
*----------------------------------------------------------------------*
*       CLASS CP DEFINITION
*----------------------------------------------------------------------*
*c_parent 定义
*----------------------------------------------------------------------*
CLASS c_parent DEFINITION ." 父类
  PUBLIC SECTION.
    DATA i TYPE i.
    DATA s TYPE string.
    METHODS constructor.
    METHODS zwrite.
  PRIVATE SECTION.
ENDCLASS.                    "A DEFINITION
*----------------------------------------------------------------------*
*       CLASS c_parent IMPLEMENTATION
*----------------------------------------------------------------------*
*c_parent 实现
*----------------------------------------------------------------------*
CLASS c_parent IMPLEMENTATION.
  METHOD constructor.
    WRITE / '父类创建!'.
  ENDMETHOD.                    "constructor
  METHOD zwrite   .
    WRITE / '父类write.'.
  ENDMETHOD.                 "destructor
  "destructor
ENDCLASS .               "a
 
START-OF-SELECTION.
  DATA cp  TYPE REF TO c_parent . "
  DATA cp2 TYPE REF TO c_parent . "
  CREATE OBJECT cp.   "cp 实例化, 系统会在后台创建一个
                      "c_parent类型的实例(比如命名为c_parent_1)
                      "并且让cp 引用这个实例
  cp->zwrite( ).      "调用成员函数
  cp2 = cp.           " 静态声明 cp 和 cp2是相同类型.
                      " cp2 并没有实例化(后台没有创建c_parent_2),
                      " cp2只是引用了cp引用的实例.
  cp->i = 10.         " cp2->i也随之改为10. 这就是引用类型的魅力^_^
  write: / cp->i,cp2->i.
  cp2->i = 99.         " cp->i也随之改为99. 这也是引用类型的魅力^_^
  write: / cp->i,cp2->i.
  cp2->zwrite( ).     "调用成员函数
2. "="  向上转型
*&---------------------------------------------------------------------*
*& Report  Z_WYS_TYPEREF
*&
*&---------------------------------------------------------------------*
*&
*&  基类 = 派生类
*&---------------------------------------------------------------------*
REPORT  z_wys_typeref02.
 
*----------------------------------------------------------------------*
*       CLASS CP DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS c_parent DEFINITION ." 基类
  PUBLIC SECTION.
    DATA i TYPE i.
    DATA s TYPE string.
    METHODS constructor.
    METHODS zwrite.
  PRIVATE SECTION.
ENDCLASS.                    "A DEFINITION
*----------------------------------------------------------------------*
*       CLASS c_parent IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS c_parent IMPLEMENTATION.
  METHOD constructor.
     " 父类创建
    WRITE / '父类创建!'.
  ENDMETHOD.
    METHOD zwrite   .
    WRITE / '父类write.'.
  ENDMETHOD.                 "destructor
                    "destructor
ENDCLASS .               "a
*----------------------------------------------------------------------*
*       CLASS c_child DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS c_child DEFINITION INHERITING FROM c_parent.
  PUBLIC SECTION.
    DATA child_str TYPE string.
    METHODS constructor .
    METHODS zwrite REDEFINITION.
ENDCLASS.                    "
*----------------------------------------------------------------------*
*       CLASS ac IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS c_child IMPLEMENTATION.
  METHOD constructor .  " 子类创建
    super->constructor( )."先调用父类的构造函数
    WRITE  '子类创建!'.
  ENDMETHOD.
  METHOD zwrite   .
    WRITE / '子类write.'.
  ENDMETHOD.                 "destructor
ENDCLASS.                    "ac IMPLEMENTATION
START-OF-SELECTION.
  DATA cp  TYPE REF TO c_parent . "
  DATA cc  TYPE REF TO c_child . "
  CREATE OBJECT cc ." 创建子类实例
  cp = cc.          " 父类 = 子类
                    " 静态声明中"=" 两边类型不匹配,
                    " 但是"=" 左边是右边的基类
                    " 所以语法检查通过
  cp->zwrite( ).    " 调用子类的方法
3. "?=" 向下转型
*&---------------------------------------------------------------------*
*& Report  Z_WYS_TYPEREF
*&
*&---------------------------------------------------------------------*
*&
*&  派生类 = 基类
*&---------------------------------------------------------------------*
REPORT  z_wys_typeref03.
 
*----------------------------------------------------------------------*
*       CLASS CP DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS c_parent DEFINITION ." 父类
  PUBLIC SECTION.
    DATA i TYPE i.
    DATA s TYPE string.
    METHODS constructor.
    METHODS zwrite.
  PRIVATE SECTION.
ENDCLASS.                    "A DEFINITION
*----------------------------------------------------------------------*
*       CLASS c_parent IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS c_parent IMPLEMENTATION.
  METHOD constructor.
     " 父类创建
    WRITE / '父类创建!'.
  ENDMETHOD.
    METHOD zwrite   .
    WRITE / '父类write.'.
  ENDMETHOD.                 "destructor
                    "destructor
ENDCLASS .               "a
*----------------------------------------------------------------------*
*       CLASS c_child DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS c_child DEFINITION INHERITING FROM c_parent.
  PUBLIC SECTION.
    DATA child_str TYPE string.
    METHODS constructor .
    METHODS zwrite REDEFINITION.
ENDCLASS.                    "
*----------------------------------------------------------------------*
*       CLASS ac IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS c_child IMPLEMENTATION.
  METHOD constructor .  " 子类创建
    super->constructor( )."先调用父类的构造函数
    WRITE  '子类创建!'.
  ENDMETHOD.
  METHOD zwrite   .
    WRITE / '子类write.'.
  ENDMETHOD.                 "destructor
ENDCLASS.                    "ac IMPLEMENTATION
START-OF-SELECTION.
  DATA cp  TYPE REF TO c_parent . "
  DATA cc  TYPE REF TO c_child . "
*******************************************************
* 错误1
"  CREATE OBJECT cp ." 创建父类实例
"  cc = cp.         " 子类 = 父类 语法检查出错
                    " 静态声明中"=" 两边类型不匹配.
*******************************************************
*******************************************************
* 错误2
"  CREATE OBJECT cp ." 创建父类实例
"  cc ?= cp.         " 语法检查正确, 但 运行期类型不匹配
*******************************************************
*正确
  CREATE OBJECT cp type c_child." 动态创建cp 为c_child
  cc ?= cp.         " 静态语法检查正确, 动态类型一致
  cc->zwrite( ).    " 调用子类的方法
 
 
  举例完毕.
  关于 "?=", SAP 帮助中这么解释的:
 
  MOVE source {TO|?TO} destination.
  destination {=|?=} source.
  原文:
  Both these statements assign the content of the operand source to
  the data object destination. The variants with the addition TO or
  the assignment operator = are valid for all assignments between
  operands that are not reference variables,
  and for assignments between reference variables for which the
  static type of source is more specific than or the same as the
  static type of destination (narrowing cast).
  中文:
  上述两个声明,用源操作数的数据(source)给目标数据对象赋值(destination).
  "TO"或者赋值运算符"=" 适用于以下两种情况:
  1. 操作对象,包括源和目标对象都不是引用类型
  2. 如果是引用类型,源对象和目标对象类型一致(本文例子1)或者源对象要比目标对象更具体(向上转型)--(本文例子2)
 
 
  原文:
  Variants with the addition ?TO or the assignment operator ?= (casting operator)
  must be used if the source and destination are reference variables
   and the static type of source is more general than the static type
   of destination (down cast).
  For assignments between operands that are not reference variables,
  use of the question mark ? is not permitted.
  中文:
  使用"?TO"或者赋值运算符"?="(类型转换操作符)的变式,要同时具备以下两个条件:
  1.操作对象,包括源和目标对象, 都是引用类型;
  2.并且,源对象的静态类型(data语句声明的类型)要比目标对象更抽象(向下转型).--(本文例子3)
  非引用型变量赋值不能用问号操作符.

转载于:https://www.cnblogs.com/eric0701/p/4228738.html

你可能感兴趣的文章
深入学习之mysql(三)单表操作
查看>>
web请求
查看>>
正则基础之——贪婪与非贪婪模式
查看>>
数据结构【基础知识点总结】
查看>>
Android Studio中getter和setter模版配置
查看>>
hdu 4655 Cut Pieces(想法题)
查看>>
傅里叶变化性质
查看>>
Multi Crystal Reports printing - Code
查看>>
简化得最没道理的6个汉字,让人大跌眼镜
查看>>
以太网帧、TCP与UDP段以及IP数据报格式总结
查看>>
Mongodb3安装授权
查看>>
22-angular.module
查看>>
emacs初步学习
查看>>
“Unable to load DLL” problem with SQL Server CE
查看>>
【分层图】分层图学习笔记
查看>>
jQueryUI日期显示
查看>>
转:ASCII 与 字符集存储的一篇文章
查看>>
RMAN-FORMAT-CONFIGURE及动态性能表
查看>>
设计模式(1)-行为类
查看>>
【HTK]htk阶级学习
查看>>