ABAP 7.4 及更高版本 [5]: ‘New’ in Class

2021-11-07 16:08发布


          点击此处--->   EasySAP.com 群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)

在这篇文章中,您将了解 New 关键字、以 7.40 方式创建对象和调用方法。

如果您仍然始终使用 CREATE OBJECT 和 TYPE REF TO 来声明和创建对象,那么您就是生活在过去。看看现在可以用这些对象做什么。

NEW Operator

假设您要为类 ZCL_ABAP 创建一个对象,以下是语法。

DATA(lo_abap) = NEW zcl_abap( ).    "New way

这类似于下面的一段代码。

DATA lo_abap1 TYPE REF TO lcl_abap.  "Old wayCREATE OBJECT lo_abap1.

当您拥有类的构造函数时,您可以在 ( ) 中传递值。

假设,您有以下类定义和实现。

CLASS lcl_abap DEFINITION.
  PUBLIC SECTION.
    METHODS:
      constructor IMPORTING iv_user        TYPE sy-uname,
      get_name    RETURNING VALUE(rv_name) TYPE char40.
  PRIVATE SECTION.
    DATA gv_user TYPE sy-uname.
ENDCLASS.

CLASS lcl_abap IMPLEMENTATION.
  METHOD constructor. 
    gv_user = iv_user. 
  ENDMETHOD.
  METHOD get_name.
    rv_name = 'Jagdish P'.   "This can be a query as well 
  ENDMETHOD.
ENDCLASS.



REPORT THIS 

您可以创建如下对象并使用它来调用该方法。

DATA(lo_abap) = NEW lcl_abap( 'JAGDISHP' ).
DATA(lv_name) = lo_abap->get_name( ).

这里,构造函数只有一个导入参数,所以可以不带参数名传递一个值。当构造函数或方法中有多个参数时,我们需要在调用中指定名称。

DATA(lo_abap) = NEW lcl_abap( iv_user = 'JAGDISHP' 
                              iv_type = 'Dialog' ). "only for demo

作为参考,下面是做同样事情的旧方法

DATA lo_abap1 TYPE REF TO lcl_abap.

CREATE OBJECT lo_abap1
  EXPORTING
    iv_user = 'JAGDISHP'.

CALL METHOD lo_abap->get_name
  RECEIVING
    rv_name = lv_name.

Method Chaining

REPORT THIS AD


方法链不是 ABAP 7.40 引入的东西,但它在 ABAP 7.40 中更有效。

方法链不像我们用符号冒号 [:] 来声明数据的链语句。这是一种您可以调用返回某些内容的方法并直接在代码中使用该内容的方法。我知道这很令人困惑,所以让我们看一个例子,看看如何使用方法链在行数方面优化工厂 ALV 代码。

SELECT * FROM sbook INTO TABLE @DATA(bookings).

TRY.    "Create ALV table object for the output data table
    cl_salv_table=>factory(
                     IMPORTING r_salv_table = DATA(lo_table)
                     CHANGING  t_table      = bookings ).    
    "Method chaining
    lo_table->get_functions( )->set_all( ).
    lo_table->get_columns( )->set_optimize( ).
    lo_table->get_display_settings( )->set_striped_pattern( 'X' ).

    lo_table->display( ).

  
  CATCH cx_root.   
    "Handle ErrorENDTRY.


使用方法作为操作数

我们使用下面的代码在异常被捕获后写入错误。

TRY.
    ...
  CATCH cx_root INTO lo_exception.
    lv_error_txt = lo_exception->get_error_msg( ).
    WRITE: lv_error_txt.
ENDTRY.

使用方法作为操作数,我们也可以写成如下。这消除了对辅助变量的需要。请注意,这仅在该方法是函数方法时才有可能,即该方法只有导入和返回参数。返回值被视为变量。

TRY.
    ...
  CATCH cx_root INTO lo_exception.
    WRITE: lo_exception->get_error_msg( ).ENDTRY.

这也可以用于条件。

IF lo_exception->get_error_msg( ) IS NOT INITIAL.


Avoid Type Conflict while calling methods

您可以将传递给该方法的数据转换为该方法需要的类型。

DATA(lo_abap) = NEW lcl_abap( CONV #('JAGDISHP' ) ).

Inline declaration for returning/receiving or importing variables

DATA(lv_name) = lo_abap->get_name( ).
OR
CALL METHOD lo_abap->get_name   
  RECEIVING 
    rv_name = DATA(lv_name).

一旦你有了链接各种语句的想法,代码行数开始减少,代码变得更小,更容易维护。

是的,一开始有点难以理解,但迟早你必须开始。


赞赏支持