zoukankan      html  css  js  c++  java
  • ABAP学习(14):ABAP面向对象

    ABAP面向对象

    1、类的定义与实现

    类定义:

    语法:Class <类名> definition.

            Public section.

                Methods:<方法名> Importing <参数名> type <参数类型>

                                 Exporting <参数名> type <参数类型>.

          Endclass.

    类实现:

    语法:Class <类名> implementation.

            Public section.

                Method <方法名>.

                    实现具体代码块.

                Endmethod.

          Endclass.

    2、抽象类

        抽象类定义,抽象方法定义,使用Abstract关键字。

    示例:

    "抽象类定义
    "抽象类可以包含静态成员 class-data ,class-methods,class-events
    "抽象类可以包含非抽象方法
    "抽象类可以不定义任何方法
    "抽象类 不可以create object 创建实例,但是可以用create object type ref to 创建抽象类引用,并接受子类实例
    CLASS base_class DEFINITION ABSTRACT.  "抽象类 关键子abstract,基类
      PUBLIC SECTION.
         METHODS:message ABSTRACT          "抽象方法
                    IMPORTING msg TYPE String OPTIONAL.
         METHODS:sayHello FINAL.                 "非抽象方法,final方法
         METHODS:sayBye.                         "非抽象方法
    ENDCLASS.
    
    "抽象类实现,如果抽象类没有非抽象方法,可以没有实现部分
    CLASS base_class IMPLEMENTATION.
          METHOD sayHello.
                WRITE:/ 'hello world base_class'.
          ENDMETHOD.
    METHOD sayBye. WRITE:/ 'bye bye base_class'. ENDMETHOD. ENDCLASS.

    3、类继承

    使用super类继承base_class类。使用关键字Inheriting from。

    示例:

    "super类定义,继承基类
    "final 方法:
    "final类中方法,自动识别为final方法,final类不可以定义abstract方法
    "非final类中用 final声明final方法,非final类final方法可以被子类继承,但不能重定义
    CLASS super_class DEFINITION INHERITING FROM base_class. "继承 inheriting from
      PUBLIC SECTION.
        METHODS: message REDEFINITION.  "重定义
    *    METHODS: sayHello REDEFINITION. "final方法不能重定义,编译报错
        METHODS: sayBye REDEFINITION.
    ENDCLASS.
    
    "super类实现
    CLASS super_class IMPLEMENTATION.
        METHOD message.
            WRITE:/ 'super_class:',msg .
        ENDMETHOD.
    
        "final方法不能在子类中重定义,编译报错
    *    METHOD sayHello.
    *      MESSAGE s000 WITH 'hello world super_class'.
    *    ENDMETHOD.
    
        METHOD sayBye.
          WRITE:/ 'bye bye super_class'.
        ENDMETHOD.
    ENDCLASS.

    4、Final关键字

        使用Final关键字定义final方法,final类。

    示例:

    "final类定义
    "final类:最终类,关键词fianl,不可以再被继承
    "final类可以是抽象类,这种情况只能使用它的静态组件
    CLASS final_class DEFINITION FINAL INHERITING FROM super_class.
      PUBLIC SECTION.
        METHODS:message REDEFINITION.
        METHODS:message1 IMPORTING msg TYPE String OPTIONAL.
    
    ENDCLASS.
    
    CLASS final_class IMPLEMENTATION.
      METHOD message.
        "调用父类实现方法
        CALL METHOD super->message
                    EXPORTING msg = msg.
      ENDMETHOD.
    
      METHOD message1.
        "通过me->调用当前类其他方法,相当于this,但不要用me->message1,在当前方法,调用他自身
        CALl METHOD me->message
                    EXPORTING msg = msg.
      ENDMETHOD.
    ENDCLASS.

    5、类实例化与调用

        类变量定义:

    语法:Data:<变量名> type ref to <类名>.

    类对象实例化:

    语法:create object <变量名>.

    这里的变量名相当于一个对应<类名>的实例化对象。

    调用方法:

    语法:<变量名>-><方法名>(参数1 = 值 [参数2 = 值]).

    语法:call method <变量名>-><方法名>(参数1 = 值 [参数2 = 值]).

    语法:call method <变量名>-><方法名> exporting <参数> = 值

    示例:

    "程序开始,main函数
    START-OF-SELECTION.
      DATA base_obj TYPE REF TO base_class.  "创建基类引用
      DATA final_obj TYPE REF TO final_class. "创建子类引用
      "创建子类实例
      CREATE OBJECT final_obj.
      "可以将子类直接付给父类或者基类
      base_obj = final_obj.
    
      "调用方法
      base_obj->message('hello base_obj').
      base_obj->sayHello( ). "调用的是基类hello方法,因为hello为final方法,父类可以继承,但没有重写
      base_obj->sayBye( ).   "调用的是父类的bye方法
      "也可这样写
      CALL METHOD base_obj->message
                  EXPORTING
                     msg = 'hello base_obj 1'.
    
    "OO方法动态调用
       DATA meth TYPE String.
       meth = 'MESSAGE1'.
       CALL METHOD final_obj->(meth)
                   EXPORTING
                     msg = 'hello final_obj message1'.

    6、类的构造

        ABAP中构造分类实例构造和静态构造。

    示例:

    "abap构造器
    "abap有实例构造和静态构造,
    "实例构造:constructor:
    "方法名固定,
    "每一次创建对象时调用,
    "子类自定义constructor中,必须调用super->constructor,父类构造
    
    "静态构造:class_constructor:
    "方法名固定,
    "只能被系统调用,
    "类加载时调用一次,
    "静态构造只能访问类的静态属性
    
    "构造方法不能被继承,所以不能在子类对构造方法redefination
    "不能直接用call method 调用构造方法,除非是在子类constructor中,调用super->constructor.
    "实例构造只有输入importing参数没有exporting参数.
    "静态构造没有参数.
    "构造方法必须在public部分定义
    "构造方法不能是abstract
    "静态方法不能被子类重写,除了静态构造。
    
    "父类定义
    CLASS super_class DEFINITION.
      PUBLIC SECTION.
        DATA msg TYPE String.
        CLASS-METHODS:class_constructor. "静态构造方法,没有参数
        METHODS:constructor IMPORTING msg TYPE String OPTIONAL.  "实例构造方法,不能有输出参数
    ENDCLASS.
    
    "父类实现
    CLASS super_class IMPLEMENTATION.
      METHOD class_constructor.
         WRITE:/ '父类静态构造方法'.
      ENDMETHOD.
    
      METHOD constructor.
        me->msg = msg.
        WRITE:/ msg.
        WRITE:/ '父类实例构造方法'.
        WRITE:/ '父类开始初始化'.
      ENDMETHOD.
    ENDCLASS.
    
    "子类定义
    CLASS child_class DEFINITION INHERITING FROM super_class.
      PUBLIC SECTION.
        DATA msg1 TYPE String. "子类属性
        "静态构造重定义
        CLASS-METHODS:class_constructor.  "除了静态构造可以重写,不可重写其他静态方法。
        "实例构造,不能被重写,因为构造方法不能继承,
        METHODS:constructor IMPORTING msg TYPE String OPTIONAL
                                      msg1 TYPE String OPTIONAL.
    ENDCLASS.
    
    "子类实现
    CLASS child_class IMPLEMENTATION.
      METHOD class_constructor.
        WRITE:/ '子类静态构造'.
      ENDMETHOD.
    
      METHOD constructor.
        WRITE:/ msg.
        WRITE:/ '子类实例构造'.
        "子类如果自定义实例构造,必须先调用父类constructor,将父类初始化
        CALL METHOD super->constructor
                    EXPORTING
                      msg = '子类调用父类实例构造方法'.
        me->msg1 = msg1.
        WRITE:/ '子类初始化'.
      ENDMETHOD.
    ENDCLASS.
    
    START-OF-SELECTION.
      DATA child_obj TYPE REF TO child_class. "创建子类引用
      CREATE OBJECT child_obj.  "创建子类对象

    7、接口定义与实现

        使用Interface关键字字定义接口。

    语法:Interface.

            定义方法、变量.

          endinterface.

    示例:

    "接口定义
    INTERFACE inter.
      "接口没有可见性设定,所有方法,属性都是public
      METHODS: message IMPORTING msg TYPE String OPTIONAL.
      DATA:str TYPE String.
      "常量定义,接口属性不能用value给值,常量可以
      CONSTANTS:cons TYPE String VALUE '常量'.
    ENDINTERFACE.
    
    "接口不能使用inheriting from继承,
    CLASS c1 DEFINITION.
       PUBLIC SECTION.
        METHODS:output.
        "直接在类定义 public中声明使用接口,
        "使用 ALIASES  FOR 为接口中组件赋别名
        INTERFACES:inter.
        ALIASES message0 FOR inter~message.
     ENDCLASS.
    
     CLASS c1 IMPLEMENTATION.
       METHOD:message0.
         WRITE:/ msg.
       ENDMETHOD.
    
       METHOD:output.
         WRITE:/ 'test'.
       ENDMETHOD.
     ENDCLASS.
    
    CLASS c2 DEFINITION.
        PUBLIC SECTION.
          INTERFACES:inter.
    ENDCLASS.
    
    CLASS c2 IMPLEMENTATION.
      METHOD inter~message.
        WRITE:/ msg.
      ENDMETHOD.
    ENDCLASS.
    
    START-OF-SELECTION.
      DATA inter_obj TYPE REF TO inter.  "定义接口引用
      DATA c1_obj TYPE REF TO c1.        "定义c1类引用
      DATA c2_obj TYPE REF TO c2.        "定义c2类引用
    
      CREATE OBJECT: c1_obj,c2_obj.    "创建类实例
      inter_obj = c1_obj.
      inter_obj->message('c1调用接口').
    *  inter_obj->output( ). "调用失败,因为c1新定义组件对接口是不可见的
      inter_obj = c2_obj.
      inter_obj->message('c2调用接口').
    
      "调用method写法
    *  CALL METHOD inter_obj->message('c2调用接口').
    *  CALL METHOD inter_obj->message
    *                EXPORTING
    *                 msg = 'c2调用接口'.
    *  "传入多个参数
    *  "inter_obj->message(p1 = '' p2 = '' …………).
  • 相关阅读:
    [Python] Python2 、Python3 urllib 模块对应关系
    [Python] Mac pip安装的模块包路径以及常规python路径
    git 使用详解
    版本控制工具简介
    python基础练习题(二)
    python简介,安装
    python基础练习题(一)
    python练习题之面向对象(三)
    python之input函数,if,else条件语句使用的练习题(一)
    C++ 静态变量
  • 原文地址:https://www.cnblogs.com/tangToms/p/11979171.html
Copyright © 2011-2022 走看看