[OO]ABAP OO 语法--实例看 "="与"?=" 的区别[转]

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)
  非引用型变量赋值不能用问号操作符.

时间: 2024-08-06 18:19:14

[OO]ABAP OO 语法--实例看 "="与"?=" 的区别[转]的相关文章

通过接口标准化ABAP OO开发

本文是对接口编程的讨论,希望能对年轻的开发者有所帮助. 要点: 通过接口对类方法进行更高层的抽象 接口使代码清晰易读 接口使你可以创建模拟对象(Mockup Object)以提高代码的可测试性 帮助实现SOLID原则 可以在不使用RTTS和类型转换的前提下使用多种类的不同实例. 因为在学习ABAP之前,我曾经学习过其它面向对象语言,因此我很纠结于ABAP中不存在的一个特性——重载方法(overload). 也许你会问,重载是什么? 重载就是函数或者方法有相同的名称,但是参数列表和实现不相同的情形

(转)Esfog_UnityShader教程_UnityShader语法实例浅析

距离上次首篇前言已经有一段时间了,一直比较忙,今天是周末不可以再拖了,经过我一段时间的考虑,我决定这一系列的教程会避免过于深入细节,一来可以避免一些同学被误导,二来会避免文章过于冗长难读, 三来可以让大家有更多自己思考的时间.如果我想讲述一些细节问题会另开一个系列. UnityShader语法实例浅析 上一次我在前言里大体上讲述了一下图形渲染的流程以及Shader是如何参与的,我们这系列教程还是更注重实际应用多一些,所以这一节为了以后打基础,我们来分析一下UnityShader的语法结构.如果没

OO,OO以后,及其极限

1.什么是软件开发? 软件开发的过程就是人们使用各种计算机语言将人们关心的现实世界映射到计算机世界的过程: 现在的计算机的数学理论基础是由计算机的开山鼻祖,大名鼎鼎的图灵于1937年提出的图灵机模型. 随后不到十年,电子计算机就诞生了(1945).(埃尼亚克) 我们都知道,它当时的主要任务之一就是用于导弹弹道轨迹的计算.当时的软件开发(如果可以称之为软件开发的话)与现在的大不相同.为了算一道题,要有人事先把完成加减乘除等各类运算的部件像搭积木那样搭起来,如果换一道题,则要把这些部件分解开来,根据

markdown语法实例

今天学习了有道云笔记的markdown功能,找了各种说明案列都练习了一遍,最后一篇总结的还不错的帖子特做收藏. 原文链接如下:http://blog.csdn.net/u011419965/article/details/50536937#字体字号颜色 markdown语法实例 目录 markdown语法实例 强调 分割线 引用 标题Setext方式 大标题 小标题 标题Atx方式 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 无序列表 有序列表 嵌套列表 8 文字超链Inline

xml--小结③DTD的基本语法(看懂即可)

四.DTD的基本语法(看懂即可)1.DTD:Document Type Definition2.作用:约束XML的书写规范.3.DTD文件保存到磁盘时,必须使用UTF-8编码 4.如何引入外部的DTD文档来约束当前的XML文档DTD文件在本地:<!DOCTYPE 根元素名称 SYSTEM "DTD文件的路径">DTD文件在网络上:<!DOCTYPE 根元素名称 PUBLIC "DTD名称" "DTD的路径URL"> 5.D

【C#|.NET】实例看lock(?)

这里不考虑分布式或者多台负载均衡的情况只考虑单台机器,多台服务器可以使用分布式锁.出于线程安全的原因,很多种场景大家可能看代码中看到lock的出现,尤其是在资金类的处理环节. 理论常识不多说,回到业务场景,举个例子我们的需求一般就是在某个订单进入某个安全优先级比较高的流程时要针对这笔订单做到线程互斥.至于原因,这里再插一个概念,大部分orm在做更新操作时,实际上做的是全参数更新,所谓全参数更新,假如一个订单表上有10个字段,我们只需要更新其中的一个金额字段,但是在传统orm框架中实际上在订单的实

ABAP的语法高亮是如何在浏览器里显示的

这篇文章的原文我发表在SAP官方社区上:https://blogs.sap.com/2018/03/09/how-abap-syntax-highlight-is-implemented-in-webide-launched-via-browser/ 在S/4HANA里,我们现在能在浏览器里写ABAP了,并且支持语法高亮. 你也许会问,ABAP的语法高亮是如何在浏览器里显示的?下面跟我一起来通过调试的方式自己找到问题的答案. (1). 在浏览器里敲个ABAP的关键字,比如data.发现被高亮了.

Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别(转)

一.Java的反射机制   每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图:  其中 i.加载是指将编译后的java类文件(也就是.class文件)中的二进制数据读入内存,并将其放在运行时数据区的方法区内,然后再堆区创建一个Java.lang.Class对象,用来封装类在方法区的数据结构.即加载后最终得到的是Class对象,并且更加值得注意的是:该Java.lang.Class对象是单实例的,无论这个类创建了多少个对象,他的Class对象时唯一的!!!!.

JS 的实例和对象的区别

对于传统的OOP思想,JS的语法确实比较难搞,其中之一就是实例和对象的区别. 什么是实例? 实例是类的具体化产品. JS语法没有类这个概念(当然ES6引用了类这个概念).只能通过构造函数来创建类,例如: var person = new Object(); //person就是实例 什么是对象? JS是面向对象的语言,一切都是对象,那么函数也是对象.实例也是对象.对象字面量也是对象 即:对象是一个具有多种属性的内容结构! 所以:实例都是对象,而对象不全是实例!